jvm调优

jvm 基础篇-(2)- 对象分配及回收♻️(-XX:-Hand

2019-08-11  本文已影响0人  tianlang136520

对象分配规则

堆内存:

image.png

分配策略:

1、jvm内存宏观分配策略
内存宏观分配策略
虚拟机栈分配<<<<<传送门
2、堆内分配策略
堆内分配策略
1、对象优先分配在Eden区。

     如果Eden区没有足够的空间时,虚拟机执行一次Minor GC(Yong GC)。

2、大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。

     这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝(新生代采用复制算法收集内存)。

3、长期存活的对象进入老年代。

     虚拟机为每个对象定义了一个年龄计数器,如果对象经过了1次Minor GC那么对象会进入Survivor区,之后每经过一次Minor GC那么对象的年龄加1,知道达到阀值对象进入老年区。
-XX:MaxTenuringThreshold用来定义年龄的阈值。

4、动态判断对象的年龄。

     如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

5、空间分配担保。

     在发生Minor GC(Yong GC)之前,JVM会计算Survivor区移至老年区的对象的平均大小,虚拟机会检查老年代最大可用的连续空间是否大于需要转移的对象大小。
           如果大于,则此次Minor GC(Yong GC)是安全的。
           如果小于,jdk1.6之前:则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
                如果大于,则尝试进行一次Minor GC(Yong GC),但这次Minor GC(Yong GC)依然是有风险的,失败后会重新发起一次Major GC(Full GC);
                如果小于或者HandlePromotionFailure=false,则改为直接进行一次Major GC(Full GC)。

但是在jdk1.6 update 24之后-XX:-HandlePromotionFailure 不起作用了,只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MonitorGC,否则FullGC
jdk1.8下,HandlePromotionFailure会报错,Unrecongnized VM option

️回收️:

什么样的对象会被回收♻️?
GC ROOT有哪些?
GC回收器清理对应堆得区域
内存区域 回收算法 触发回收条件 垃圾回收器 线程
Young Generation 复制算法 Eden区没有足够的空间时 Minor GC / Young GC 单or多线程(可选择)
Old Generation 标记清除算法 Old使用达到CMS设置的阀值-XX:CMSInitiatingOccupancy
Fraction=70
Old GC/Major GC 单or多线程(可选择)
Heap Generation Young Generation采用复制算法
Old Generation采用标记整理算法
1、调用System.gc时。
2、老年代空间不足
3、方法区空间不足
4、Concurrent Mode Failure
CMS进行回收过程中有大对象
要申请进入Old区此时老年代空
间不足,就会报
Concurrent Mode Failure错误,
同时触发fullgc。
5、Minor GC后进入老年代对象
对象占用空间大小大于老年代的
可用内存。
6、执行 jmap -histo:live or
jmap -dump:live
Full GC 单线程
常见GC
上一篇 下一篇

猜你喜欢

热点阅读