- GC垃圾回收
- minor GC
- full gc(时间比较长)
- 老年代空间分配担保机制
- 垃圾回产生的影响:
- STW(stop the world):垃圾回收的时候业务线程会停止(造成卡顿)
- 为什么要涉及STW
- 因为没有stw 在垃圾回收的时候:如果业务线程抢先执行完了,标记好的的非垃圾对象就会变成垃圾对象,这会造成垃圾回收不准确,无法正常完成;所以在设计的时候设计了STW
- 堆结构:
- 年轻代(1/3)
- Eden区
- survivor 1区
- survivor 2区
- 垃圾回收算法
- 复制算法:效率快,但是浪费内存空间 :年轻代的设计为 Eden区内存:survivor 1区:survivor 2区 8:1:1;这样的设计可以有效的利用内存,每次只有1/10的内存浪费,且可以手动设置(调优)
- 老年代(2/3)
- 垃圾回收算法
- 标记清除算法 :会产生内存碎片
- 标记整理算法:你不会产生内存碎片,但是效率低
- 垃圾回收算法
- 垃圾回收的过程:
- 先在eden去选出不是垃圾的对象 ,copy到一个servivor区,然后把eden区直接回收掉,第二次回收的时候,把eden区和servivor区的非垃圾对象cope到另一个survivor区,然后把2个区域的对象回收掉,
- 对象在回收次数到达指定的年纪(次数)都没有被回收掉,则会晋升到老年代区, 默认是15岁,CMS垃圾回收器默认6岁,不同的垃圾回收器不同,可以通过参数-XX:MaxTenringThreshold来设置
- 对象动态年龄判断
- 当前方对象的其中一个survivor去,一批要放进来的对象总大小超过这块survivor的内存大小的50%时(也可以设置),那么此时在survivor中大于等于这批对象年龄的最大值的对象就可以进入老年代了; 这个机制就是为了让存过时间长的对象尽快进入老年代,对象的动态年龄判断一般都是在minor gc之后触发
- 老年代空间分配担保机制
- 年轻代每次minor gc之前 JVM 都会计算剩余的老年代的可用空间,如果可用空间小于年轻代现有的所有对象的大小之和(包括垃圾对象), 如果小于的会触发一次Full gc ,对老年代和年轻代一起回收一次垃圾,如果回收完还是没有足够的空间存放新的对象就会发生’’OOM’’
- 当然,如果minor gc 之后剩余存货的需要挪动到老年嗲的对象带线还是大于老年代的可用空间,那么也会触发Full gc,,如果回收完还是没有足够的空间存放存活的对象就会发生’’OOM’’
- 大对象也会进入老年区
- jvm调优就是减少gc,特别是减少Full gc
- 年轻代(1/3)