(一)内存分配与回收策略
给对象分配内存、
回收分配给对象的内存
1、对象优先在Eden分配
通过
-XX:+PrintGCDetails
打印收集器日志
-XX:SurvivorRatio=8
指定Eden区大小
-XX:+UseSerialGC
使用指定的收集器(Serial+Serial Old)
2、大对象直接进入老年代
大对象指需要大量连续内存空间的Java对象,最典型的就是很长的字符串以及数组。
通过-XX:PretenureSizeThreshold
参数指定需要分配至老年代的对象大小阈值
3、长期存活的对象将进入老年代
-XX:MaxTenuringThreshold
在Survivor区每熬过一次Minor GC,年龄Age就会加1,直到加到阈值就会被晋升到老年代
动态对象年龄判定
:如果Survivor控件中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就会直接进入老年代,无需等到设置的阈值中要求的年龄。
4、空间分配担保
在Minor GC之前,虚拟机需要先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果成立则确保Minor GC是安全的;如果不成立,则会查看HandlePromotionFailure设置值是否允许担保失败,如果允许,则继续检查老年代最大可用空间是否大于历次晋升到老年代对象的平均大小,如果大于,则尝试Minor GC,尽管是有风险的,如果小于,则要进行Full GC。
-XX:+HandlePromotionFailure
(二)逃逸分析与栈内分配
参考:
https://blog.csdn.net/qiyue683209/article/details/82961472
通过逃逸分析来决定某些实例或者变量是否要在堆中进行分配,如果开启了逃逸分析,即可将这些变量直接在栈上进行分配,而非堆上进行分配。这些变量的指针可以被全局所引用,或者被其它线程所引用。
网友评论