Java垃圾回收那些事
堆内存的划分
-
Young Generation : 新生代
-
Tenured/Old Generation : 老年代
-
Permanent Generation : 永久代
Young Generatioin
大多数的应用中持有的对象很大部分是短生命周期的,这被称为“Weak generational hypothesis”。在垃圾回收期间分析应用中所有的对象是一件缓慢而耗时的工作,因此可以将短生命周期的对象在其被创建时就分隔出来。因此New Generation可以进一步划分为:
-
Eden Space (Eden空间):所有的新创建的对象都存在与此。当其变满时,minor GC便会出现。然后所有仍然被引用的对象被移动到幸存者空间中。
-
Survivor Spaces (幸存者空间):对不同的JVM而言,幸存者空间的实现方式也不尽相同,但基本原理都是相同的。New Generation中的每一个GC都会增加幸存者空间中的对象年龄。如果对象的年龄超过某个特定值(默认情况下是15),该对象会被移往Old Generation。
New Generation中的GC也被称为minor GC。使用New Generation的好处是可以减少分片带来的影响。
Old Generation
任何从New Generation中的幸存者空间中幸存下来的对象会被送往Old Generation。Old Generation通常比New Generation大很多。存在于Old Generation中的GC也被称为Full GC。Full GC可以执行“Stop The World”机制,并且通常会占用更长的时间,因此Full GC也称为绝大不多的JVM可以进行优化的地方。
Permanent Generation
Permanent Generation用于存放类的元信息。在Java 8中其被metaspace所取代。通常Permanent Generation无需为了确保其有足够空间而被优化,但是当类没有被正确上传时,其仍有可能发生内存泄露的情况。
堆大小参数
GC算法
-
标记清除算法
-
复制算法
-
标记整理算法
标记清除算法
分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。该算法的缺点是效率不高并且会产生不连续的内存碎片。
复制算法
把内存空间划为两个区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。优点:实现简单,运行高效。缺点:会浪费一定的内存。一般新生代采用这种算法。
标记整理算法
标记阶段与标记清除算法一样。但后续并不是直接对可回收的对象进行清理,而是让所有存活对象都想一端移动,然后清理。优点是不会造成内存碎片。
圾垃回收器类型
- 串行垃圾回收器(Serial Garbage Collector)
串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。
- 并行垃圾回收器(Parallel Garbage Collector)
并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。
- 并行标记扫描垃圾回收器(SMS Garbage Collector)
并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。
-
当标记的引用对象在tenured区域;
-
在进行垃圾回收的时候,堆内存的数据被并发的改变。
相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。
- G1垃圾回收器(G1 Garbage Collector)
G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域。
-XX:+UseSerialGC : 串行垃圾回收器
-XX:+UseParallelGC : 并行垃圾回收器
-XX:+UseConcMarkSweepGC :并发标记扫描垃圾回收器
-XX:ParallelCMSThreads= : 并发标记扫描垃圾回收器=为使用的线程数量
-XX:+UseG1GC : G1垃圾回收器