深入理解Java虚拟机 --- 内存分配与回收策略

对象优先在Eden区分配

大多数情况下,对象在Eden区进行分配。

当Eden区没有足够的空间来进行分配时,就会触发Young GC(Minor GC)。

当触发Young GC时,如果Survivor区不够放存活的对象,那么就会触发分配担保机制提前转移到老年代。

大对象直接进入老年代

大对象的问题:

1、容易导致内存明明还有不少空间时就提前触发垃圾收集。

2、复制大对象时需要高额的内存复制开销。

HotSpot提供了-XX:PretenureSizeThreshold ,指定了大于该设置值的对象直接在老年代分配,目的是为了避免大对象在Eden及两个Surivor区之间的来回复制。

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

虚拟机给每个对象定义了一个对象年龄的计数器,存储在对象头中。

每次经历Young GC且仍存活的对象,都会加一岁。当到达指定的年龄(默认15岁)就会进入到老年代。

动态对象的年龄判断

HotSpot虚拟机并不是一定要求对象达到指定年龄才能进入老年代。

当某一个年龄(x)的所有对象的大小占survivor区大于一半时,那么年龄≥x的对象都会晋升到老年代。

GC的触发条件

Young GC

当年轻代空间不足时,就会触发Young GC。

Old GC

当老年代内存不足时,会触发Old GC。

Full GC

触发条件:

1、老年代或者元空间内存不足

2、System.gc()方法调用

3、堆内存分配担保失败(大对象)

posted @   ayu0v0  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示