堆的新生代和老年代

本文详细解析了Java新生代和老年代的内存管理机制。新生代包括Eden、SurvivorFrom和SurvivorTo三个区,采用复制算法进行垃圾回收;老年代则存储存活时间长的对象,使用标记清除算法进行垃圾回收。

新生代

用来存放新创建的对象, 由于创建对象比较频繁所以新生代会频繁触发垃圾回收机制

新生代里分为三个区: Eden(新创建的对象主要在Eden区域)、ServivorFrom、ServivorTo

当Eden区 内存不够的时候 就会触发一次 MinorGC(复制算法的垃圾回收)

虚拟机每次使用新生代中的Eden和另两个中的其中一个,每次GC的时候,都会使用复制算法的GC,
	把前两个区域存活的对象一次性复制到 另一块区域,最后清理掉前两块区域.
		将此时存活下来的对象年龄设置为1,以后这些对象每在Survivor区熬过一次GC 年龄就加1
		当对象的年龄达到15(默认值),就会移动到老年代

老年代

用来存放的都是存活时间比较久的,   比较大的对象
用标记清除算法:
	会先扫描一次老年代 把存活的对象标记出来,然后 回收没有被标记的对象.
### Java内存中新生代老年的概念及作用 #### 1. 内存的划分 Java是JVM管理的最大一块内存空间,主要用于存放对象实例。被划分为两个主要区域:新生代(Young Generation)老年(Old Generation)。这种划分的目的是为了优化垃圾回收(Garbage Collection, GC)的效率[^1]。 - **新生代(Young Generation)** 新生代内存中用于存放新创建对象的区域,默认占内存的1/3[^2]。它又被进一步划分为三个子区域: - Eden区:大多数新创建的对象都会被分配到Eden区。 - Survivor From区:在Minor GC后,存活的对象会被移动到Survivor From区。 - Survivor To区:作为临时存储区域,在下一次Minor GC时,存活的对象会被移动到这里。 默认情况下,Eden : Survivor From : Survivor To的比例为8:1:1,即Eden区占用新生代的80%,两个Survivor区各占10%[^1]。 - **老年(Old Generation)** 老年内存中用于存放长期存活对象的区域,默认占内存的2/3。当对象在新生代中经历了多次Minor GC后仍然存活,就会被晋升到老年老年的GC通常称为Major GC或Full GC,其频率较低但耗时较长。 #### 2. 新生代老年的特点 - **新生代的特点** - 对象生命周期短:大多数对象在新生代中被创建并很快被回收。 - GC频率高:新生代的GC称为Minor GC,发生频率较高,但执行速度较快。 - 内存分配策略:JVM使用“复制算法”来管理新生代的内存分配回收。每次Minor GC后,存活的对象会被复制到另一个Survivor区,而空闲的Survivor区会被清理。 - **老年的特点** - 对象生命周期长:老年存放的是经过多次Minor GC后仍然存活的对象。 - GC频率低:老年的GC称为Major GC或Full GC,发生频率较低,但涉及的内存范围更大,因此耗时较长。 - 内存分配策略:老年通常使用“标记-清除”或“标记-整理”算法进行内存管理[^4]。 #### 3. 内存的大小设置 内存的大小可以通过以下参数进行设置: - `-Xms`:设置JVM启动时的初始内存大小。 - `-Xmx`:设置JVM允许使用的最大内存大小。 - `-XX:NewRatio`:设置新生代老年的比例,默认值为1:2[^1]。 - `-XX:SurvivorRatio`:设置Eden区与Survivor区的比例,默认值为8:1:1。 #### 4. 示例码 以下是一个简单的示例程序,展示如何获取内存的大小信息: ```java public class HeapMemoryExample { public static void main(String[] args) { // 获取JVM中的内存总量 long totalMemory = Runtime.getRuntime().totalMemory(); // 获取JVM允许使用的最大内存量 long maxMemory = Runtime.getRuntime().maxMemory(); System.out.println("Total Memory (Xms): " + totalMemory + " bytes, " + (totalMemory / (double) 1024 / 1024) + " MB"); System.out.println("Max Memory (Xmx): " + maxMemory + " bytes, " + (maxMemory / (double) 1024 / 1024) + " MB"); } } ``` #### 5. 垃圾回收机制 - **Minor GC**:发生在新生代中,清理不再引用的对象,并将存活对象移动到Survivor区或老年。 - **Major GC/Full GC**:发生在老年中,清理不再引用的对象,通常涉及整个内存的扫描整理。 #### 6. 注意事项 - 在Java 8及更高版本中,永久被移除,取而之的是元空间(Metaspace),后者位于本地内存中[^4]。 - 如果内存不足,可能会导致`OutOfMemoryError`异常。可以通过监控内存使用情况调整大小参数来避免此类问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoBugsBoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值