堆空间内存结构:
对象分配过程:
- 首先将对象放入伊甸园区(Eden)
- 当伊甸园区放满以后,则开始垃圾回收(YGC/MinorGC)
- 经过YGC以后,还存在引用的对象将放入S0区,此时会分配一个年龄计数器(age),初始值为1,此时,伊甸园区完全清空
- 再继续向伊甸园区放入对象
- 当伊甸园区再次满了以后,将再次触发YGC,将垃圾回收,还存在引用的对象放入S1区,此时从伊甸园区放入S1区的age=1,接着判断S1区对象是否还被使用,若还在使用,则也将其放入S1区,此时它们的age变成2;
- S1区和S2区也叫from区和to区,但并不是固定的,执行完GC以后,谁空谁就是to区,Eden区的对象先往to区放。
- 当对象的age变为15,再次需要移动时,此时对象将做一个Promotion(晋升),晋升到老年代,15称为阈值。
- 注意:只有Eden区满了以后才会触发YGC,Survivor区满了不会出发YGC,当Eden区满了触发YGC时,会顺带着回收survivor区的无效对象。
幸存者s0、s1区总结:复制之后有交换,谁空谁是to
关于垃圾回收:频繁在新生代收集、很少在养老区收集,几乎不在永久区/元空间收集
课件描述:
对象分配过程的特殊情况:
MinorGC、MajorGC、FullGC之间的区别和联系:
年轻代GC触发机制:
MinorGC会引发STW(stop the world),暂停其他用户线程
老年代GC触发机制:
FullGC的触发机制:
对Java中的堆进行分代的主要原因是为了优化GC性能
内存分配策略:
TLAB:
产生的原因:
TLAB解释:
图解:
useTLAB参数默认情况下是开启的
由于TLAB的存在,所以如果说堆空间都是共享的,这句话存在问题。
TLAB是每个线程一份,大小只占eden区的1%左右。
堆空间的参数设置:
具体查看某个参数的指令:jps:查看当前运行中的进程
jinfo -flag SurvivorRation 进程id
设置空间分配担保的原因:
可以简单理解为从jdk7以后,空间分配担保参数可以默认为true;