JVM的故事—— 内存分配策略

内存分配策略

文章目录


一、对象优先在Eden分配

堆内存有新生代和老年代,新生代中有一个Eden区和一个Survivor区(from space或者to space)。当有新的对象分配时,会优先分配在Eden区。当Eden区空间不足分配给新对象时,会进行一次minor GC,回收完没有引用的对象后,先考虑把一些Eden区的对象放到Survivor区,如果放不下,就放到老年代中。

二、大对象直接进入老年代

大对象就是指需要连续大内存的Java对象。比如长字符串或者数量庞大的数组。HotSpot虚拟机提供了-XX:PretenureSizeThreshold 参数,当对象大于该指定大小就会直接进入老年代,这就防止了对象在Eden区和Survivor区来回复制。

三、长期存活的对象将进入老年代

对象通常在Eden区诞生,如果经过第一次Minor GC后仍然存活并能被Survivor区存储,该对象就会被移到Survivor区,并且Age(年龄计数器)为1。此后该对象在Survivor区每经过一次Minor GC,Age就加一。当Age达到一个阈值时,就把该对象放入老年代。

四、动态对象年龄判定

Hotspot虚拟机中并不一定要求对象的Age达到XX:MaxTenuringThreshold设定的值才进入老年代。当Survivor区有一半以上的空间都被相同年龄的对象占据,年龄大于等于该值的对象都可以进入老年代。

五、空间分配担保

在发生Minor GC之前,需要检查老年代最大可用的连续空间是否大于新生代所有对象总和。如果大于,则可以确保Minor GC是安全的;如果不大于,则需要检查XX:HandlePromotionFailure参数的设置值是否允许担保失败。若允许,则用老年代最大可用的连续空间与历次进入老年代的对象平均大小进行对比,若大于,则进行一次有风险的Minor GC,反之进行full GC。若不允许担保失败,则直接进行full GC。


相关推荐
yoyo_zzm5 分钟前
Laravel6.x新特性全解析
java·spring boot·后端
Nick_zcy17 分钟前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝19 分钟前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
qinqinzhang1 小时前
Java 中的 IoC、AOP、MVC
java
禾叙_1 小时前
【langchain4j】结构化输出(六)
java·开发语言
饭小猿人1 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
Advancer-2 小时前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
\xin2 小时前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++2 小时前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
2301_815901972 小时前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python