JVM

  • JVM的内存划分
  • 类加载器

四种类加载器:

  1. 启动类加载器:C++编写,在Java中看不到
  2. 扩展类加载器:ExtClassLoader
  3. 应用类加载器:AppicationClassLoader
  4. 自定义类加载器:创建一个类继承java.lang.ClassLoader,定制类加载方式

关系:启动类加载器是扩展类加载器的父加载器,扩展类加载器是应用类加载器的父加载器.

双亲委派模型:

优点:保证了类的唯一性,避免类的重复加载,父加载器加载了某个类,子加载器就不加载了,全类名是唯一标识

安全性考虑,比如String等Jre自带的核心Api,由最父类的启动类加载器加载,不由它的子类加载器恶意替换.

  • 方法栈

堆栈先进后出,后进先出,像是一个弹簧,压栈,弹栈概念,方法每次被调用,都会产生一个栈帧,方法内的局部变量,方法释放,变量也释放

栈帧的结构:

局部变量表:方法执行时的参数、方法体内声明的局部变量

操作数栈:存储中间运算结果,是一个临时存储空间

帧数据区:保存访问常量池指针,异常处理表

操作数栈的存在,保存一个临时存储空间,例如数值交换int a = 5 和int b = 6 交换

栈溢出异常(StackOverflowErro):

例如一个没有退出机制的递归方法,只占用不结束,一直产生栈帧,一直在申请空间,把栈空间挤满,栈空间一直不释放,一直在堆积,把栈内存中的空间耗尽

某一个线程抛出『栈溢出异常』,会导致其他线程也崩溃吗?

不会,线程对栈内存空间的使用方式是彼此隔离的。每个线程都是在自己独享的空间内运行,反过来也可以说,这个空间是当前线程私有的。

工作机制:

新new出来的对象最先放在新生代的伊甸区,

伊甸区的使用空间达到一定的值后触发Minor GC垃圾回收,

没有被这个小GC回收的会成为幸存者,去往幸存者区,

幸存者区有from和to2个区,(谁空谁为to区,意味着这2个区是互相彼此交换的)

from区快满了就去往了to区,此时from变成了空成为了to区,而to区就变成了from区

如果一个对象经过了15次GC还没有被垃圾回收,那么就会去往老年代区保存,

如果幸存者区满了,即是没有15次GC,这个对象也会去往老年代区保存

说明:

eden区存储的主要是短暂临时,生命周期很短的对象

幸存者区是一个中间地带

老年代区是存放生命周期很长的对象,例如IOC管理的对象(Controller,Service,Mapper等等),线程池对象,数据库连接池对象等等...

不被回收是因为栈中一直有个变量指引着这个地址,相当于有一根线连接起来了,如果这个线断了,就是不指向这个对象的地址了,那么就会被GC垃圾回收机制回收,老年代区的对象就是一直有这根指引着

堆溢出异常(OutOfMemeory):

包括两种Java.heap.space和PermGen space,前者是一直在new Object而且不回收,超出了堆内存

后者PermGen space翻译过来也很好理解,permanent generation永久代的问题,是永久代(方法去)加载的时候,类实在太多了,就导致方法区直接溢出了

GC的使用

为什么要GC:

程序运行中,会产生很多对象,如果不处理垃圾对象,那么一直累加会导致内存耗尽,程序崩溃,GC就是处理不使用的垃圾对象,释放内存

如何找出垃圾对象:

引用计数法(不靠谱,如果有循环引用的对象,不能够标记到)

可达性分析(从GC Roots对象出发,不可达的对象就是要清理的对象)

GC的算法:

基本算法

引用计数法:使用引用标记法标记对象被引用的次数,引用加1,删除减1,当引用计数为0 则GC

标记清除法:当堆的有效内存即将耗尽的时候,暂时挂起程序(stop the world),从根对象开始遍历所有的对象,然后再清楚所有没有被标记到的对象

标记压缩法:标记清除法的升级,同样当堆有效内存即将耗尽,暂时挂起,从根对象遍历所有对象,然后中间多一步压缩, 移动所有的可达对象到堆内存的同一个区域中,使他们紧凑的排列在一起,从而将所有非可达对象释放出来的空闲内存都集中在一起,通过这样的方式来达到减少内存碎片的目的。

复制算法:复制算法的核心就是,将原有的内存空间一分为二,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,并依次排列,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。

综合算法

分代算法:前面介绍了多种回收算法,每一种算法都有自己的优点也有缺点,谁都不能替代谁,所以根据垃圾回收对象的特点进行选择,才是明智的。分代算法其实就是这样的,根据回收对象的特点进行选择新生代使用复制算法,老年代使用标记清除或者标记压缩方法

分区算法:有点类似微服务那种分布式,把堆空间划分为多个不同的小区间,每个小区间独立使用独立回收,这样可以控制一次回收多个区间,并不像标记清除和压缩方法一样,需要把程序全部挂起一段时间

JVM的常用参数:

-Xms 堆内存的初始化大小(建议初始化大小和最大值一样,这样就不需要多次提交申请)

-Xmx 堆内存的最大值

-Xmn 新生代内存的大小

-XX:PermSize 永久代的大小

-XX:MaxPermSize 永久代的初始化大小

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容