一次完整的垃圾回收(Garbage Collection)过程在JVM中可以分为几个阶段,通常包括以下步骤:
1. **标记(Marking):** 遍历所有活跃对象,标记它们为活动对象,通常使用根对象作为起点,通过可达性分析算法标记活跃对象。
2. **清除(Sweeping):** 清除所有未标记的对象,即被标记为垃圾的对象。这些对象的内存可以被重新使用。
3. **压缩(Compacting,某些垃圾回收器支持):** 对象被清除后,将存活的对象压缩到一起,减少内存碎片化,提高内存利用率。
对象晋升到老年代的过程通常是由对象的年龄决定的。在新生代的Eden区对象经过多次垃圾回收仍然存活的,会被移到Survivor区,而在Survivor区经过一定次数的垃圾回收后仍然存活的对象,会晋升到老年代。
### 一些主要的JVM参数包括:
1. **-Xms 和 -Xmx:** 分别用于设置JVM的初始堆大小和最大堆大小。比如 `-Xms512M -Xmx2G` 将初始堆大小设置为512MB,最大堆大小设置为2GB。
2. **-XX:NewRatio 和 -XX:SurvivorRatio:** NewRatio用于设置新生代和老年代的大小比例,默认为2,表示新生代占整个堆大小的1/3。SurvivorRatio用于设置Eden区和Survivor区的大小比例,默认为8,表示Eden和每个Survivor区的比例为8:1。
3. **-XX:MaxPermSize(已弃用,取决于JVM版本)或 -XX:MaxMetaspaceSize:** 用于设置永久代(Java 8及之前版本)或元空间(Java 8及以后版本)的最大大小。
4. **-XX:ParallelGCThreads 和 -XX:ConcGCThreads:** 分别用于设置并行垃圾回收器的线程数和并发垃圾回收器的线程数。
5. **-XX:+UseG1GC、-XX:+UseParallelGC、-XX:+UseConcMarkSweepGC:** 用于选择不同的垃圾回收器。G1GC、ParallelGC和Concurrent Mark Sweep (CMS)是JVM提供的不同垃圾回收器,各自适用于不同场景和性能要求。
这些参数可以根据应用程序的特性和需求进行调整,以优化性能、减少垃圾回收的停顿时间以及更好地利用内存。