在 Java 虚拟机中,对象的分配是通过垃圾收集器来管理的。Java 虚拟机通常会将堆内存划分为不同的区域,其中包括年轻代、老年代以及永久代(或元空间)。对象的分配规则主要涉及到在不同的区域中进行分配以及对象晋升的过程。
以下是一些关键的对象分配规则:
-
新对象分配规则:
- 新创建的对象通常会被分配到年轻代的 Eden 区。如果 Eden 区没有足够的空间来容纳新对象,就会触发一次 Minor GC,将存活的对象移动到 Survivor 区或老年代,并清空 Eden 区。
-
对象晋升规则:
- 对象在年轻代经历一定次数的 Minor GC 后,仍然存活的对象将会被晋升到老年代。这个次数由参数
-XX:MaxTenuringThreshold
来控制,默认是15次。
- 对象在年轻代经历一定次数的 Minor GC 后,仍然存活的对象将会被晋升到老年代。这个次数由参数
-
大对象直接进入老年代:
- 如果对象的大小超过了一个阈值(通常是在 1MB 到 16MB 之间,具体取决于具体的虚拟机实现和配置参数),则该对象将直接被分配到老年代,而不经过年轻代。
-
长期存活的对象进入老年代:
- 在年轻代的 Survivor 区中,对象经过多次的复制,如果仍然存活,就有可能晋升到老年代。这是因为 Survivor 区的大小是有限的,不足以容纳长期存活的对象。
-
空间分配担保:
- 在发生 Minor GC 之前,虚拟机会检查老年代的剩余空间是否足够容纳新生代所有对象的存活空间。如果足够,那么 Minor GC 可以顺利进行;如果不足,虚拟机会触发一次 Full GC。
这些规则的设计旨在提高垃圾回收的效率和降低内存占用。通过将对象按照其生命周期和大小分配到不同的区域,并根据其存活情况进行不同的处理,可以更好地适应实际应用程序的内存使用模式。
Was this helpful?
0 / 0