JVM中的垃圾回收(GC)是自动内存管理的核心部分,它负责回收不再使用的对象以释放内存。GC主要分为两个阶段:年轻代(Young Generation)GC(YGC)和老年代(Old Generation)GC(Full GC,也被称为FGC)。下面将详细介绍一次完整的GC流程,特别是对象如何从年轻代晋升到老年代,以及几种主要的JVM参数。
一次完整的GC流程
- 年轻代(YGC):年轻代是垃圾回收最频繁的区域,存放新创建的对象。当年轻代空间不足时,会触发YGC。YGC主要回收的是不再使用的短期对象,即回收生命周期短的对象。
- 老年代(FGC):老年代存放长时间存活的对象。当老年代空间不足时,会触发FGC。FGC回收的是长时间存活的对象和空间不足以分配新对象的情况。
对象如何晋升到老年代
- 对象在年轻代的生命周期:新创建的对象首先被分配到年轻代的Eden区。当Eden区满了之后,会触发Minor GC(YGC),存活的对象将被移动到Survivor区。经过多次Minor GC后,Survivor区也会满,此时存活的对象将被移动到另一个Survivor区或老年代。
- 对象晋升到老年代的条件:对象在Survivor区经历了一定次数的Minor GC后仍存活,或者对象的年龄超过一定的阈值(可通过JVM参数设置),就会被晋升到老年代。
几种主要的JVM参数
- -Xms<size>g 和 -Xmx<size>g:这两个参数用于设置Java堆的初始和最大堆大小。例如,
-Xms512m -Xmx1024m
分别设置初始堆大小为512MB和最大堆大小为1024MB。 - -XX:NewRatio:这个参数用于设置老年代和年轻代的比例。例如,
-XX:NewRatio=3
表示老年代和年轻代的比例是3:1。 - -XX:SurvivorRatio:这个参数用于设置Eden区与Survivor区的比例。例如,
-XX:SurvivorRatio=8
表示Eden区与Survivor区的比例是8:1。 - -XX:MaxTenuringThreshold:这个参数用于设置对象在年轻代中可以经历的最大GC次数,之后将晋升到老年代。默认值是15,但可以根据需要进行调整。
- -XX:+UseConcMarkSweepGC 和 -XX:+UseParallelGC:这些参数用于选择垃圾回收器。前者选择CMS垃圾回收器,后者选择Parallel垃圾回收器。不同的应用场景可能需要不同的垃圾回收器。
以上就是JVM中一次完整的GC流程以及相关的JVM参数介绍。在实际应用中,需要根据应用的特性和需求来调整这些参数,以达到最佳的性能和响应效果。