垃圾收集的基本概念
垃圾收集的基本目标是自动识别和回收不再使用的对象的内存空间,从而为新的对象腾出空间。这使得开发者不必手动释放内存,减少了内存管理的复杂性。
分代理论
在JVM中,垃圾收集的实现通常基于一种叫做“分代理论”的策略。这个策略是基于这样的观察:大多数对象的生命周期是很短的,少数对象会存活较长时间。因此,JVM将堆内存划分成几个不同的区域,分别处理生命周期不同的对象。这些区域主要包括:新生代(Young Generation)、老年代(Old Generation)和永久代(现在被称为元空间,Metaspace)。
-
新生代(Young Generation):
- Eden区:大部分新对象会在这里分配内存。这个区域的对象通常会很快变得不再需要。
- Survivor区:新生代中有两个Survivor区(通常叫做S0和S1),用于管理那些在Eden区中经过一次垃圾收集后仍然存活的对象。
新生代的垃圾收集频率较高,但因为大多数对象都是短命的,所以这种收集通常很快被完成。这种收集被称为“Minor GC”。
-
老年代(Old Generation):
- 经过多次Minor GC后仍然存活下来的对象会被移动到老年代。老年代的对象通常生命周期较长。
老年代的垃圾收集频率较低,因为对象存活时间较长。这个收集过程通常叫做“Major GC”或“Full GC”,它比Minor GC耗时更多。
-
永久代/元空间(PermGen/Metaspace):
- 存储类信息、方法、常量池等元数据。Java 8之后,永久代被移除,取而代之的是元空间,元空间在本地内存中分配,而不是在堆内存中。
垃圾收集器
JVM提供了多种垃圾收集器,每种收集器在性能和延迟上都有不同的特点,比如:
- Serial Collector:适合单线程环境,小规模应用。
- Parallel Collector:适合多线程环境,注重吞吐量。
- CMS Collector(Concurrent Mark-Sweep):注重低停顿时间,适合需要快速响应的应用。
- G1 Collector(Garbage-First):适合大堆内存,兼顾低停顿和高吞吐量。
总结
- 分代理论:通过将堆内存分为新生代和老年代,分别处理短生命周期和长生命周期的对象,提高了垃圾收集的效率。
- 垃圾收集器:不同的垃圾收集器适用于不同的应用场景,开发者可以根据具体需求选择合适的垃圾收集器。