java堆内存详解.docx
堆的垃圾回收方式 java堆是GC垃圾回收的主要区域。 GC分为两种: Minor GC、Full GC(也叫做Major GC). Minor GC(简称GC) Minor GC是发生在新生代中的垃圾收集动作, 所采用的是复制算法。 GC一般为堆空间某个区发生了垃圾回收, 新生代(Young)几乎是所有java对象出生的地方。即java对象申请的内存以及存放都是在这个地方。java中的大部分对象通常不会长久的存活, 具有朝生夕死的特点。 当一个对象被判定为“死亡”的时候, GC就有责任来回收掉这部分对象的内存空间。 新生代是收集垃圾的频繁区域。 Java 堆内存是Java虚拟机管理的内存中最大的一块,它被所有线程共享,主要用来存放对象实例。在虚拟机启动时就会创建。Java堆的特点在于它的可扩展性,可以通过-Xmx和-Xms参数控制堆的初始容量和最大容量。如果堆内存不足以分配新的对象,且无法继续扩展,将会抛出`OutOfMemoryError`异常。 堆内存被细分为新生代(Young)和老年代(Old),新生代进一步划分为Eden区、From Survivor区和To Survivor区。默认比例是Eden:From:To=8:1:1,可以通过`-XX:SurvivorRatio`调整这个比例。每次垃圾收集时,只使用Eden和一块Survivor区,确保总有一块Survivor区为空闲状态,这样新生代的实际可用内存空间是90%。 垃圾收集在Java堆中主要分为Minor GC和Full GC。Minor GC主要针对新生代,采用复制算法,由于大部分对象生命周期短,新生代成为垃圾收集的频繁区域。当对象在Eden和一个Survivor区(例如from区)出生后,经过一次Minor GC,存活下来的对象会被复制到另一个Survivor区(假设是to区),同时清理Eden和原来的Survivor区。每次熬过Minor GC,对象的年龄加1,当达到一定阈值(默认15,可配置`-XX:MaxTenuringThreshold`)后,对象晋升至老年代。大对象可能直接进入老年代。 Full GC则涉及到整个堆空间和持久代,通常使用标记-清除算法,处理老年代的垃圾。由于老年代对象存活率高,Full GC的频率远低于Minor GC,但其执行时间较长,可能会造成应用暂停。标记-清除算法可能导致内存碎片,影响大对象的内存分配,若无法找到连续的内存空间,也可能提前触发GC。 Java堆内存的管理和垃圾收集是Java性能优化的重要方面。理解堆内存的结构和垃圾回收机制,可以帮助我们更好地理解和解决应用程序中的内存问题,提升系统性能。通过调整JVM参数,比如新生代和老年代的比例,以及垃圾收集的策略,可以优化应用程序的内存使用和垃圾收集效率。