GC(垃圾回收)的分类
在Java中,垃圾回收(Garbage Collection,简称GC)是自动管理内存的机制。它通过回收不再被使用的对象,释放内存空间,防止内存泄漏。GC有多种方式和策略,根据回收的范围和目标,主要可以分为以下几类:
1. 部分收集(Partial GC)
部分收集并不回收整个Java堆,而是专注于堆的某个区域进行垃圾回收。根据回收的对象范围不同,部分收集又可以细分为以下几种类型:
1.1 新生代收集(Minor GC/Young GC)
- 目标:仅回收新生代区域的垃圾。新生代是对象刚被创建并且生命周期较短的地方。大多数对象在新生代内存活时间较短,因此该区域的垃圾回收比较频繁。
- 触发:当新生代的内存空间不足时,会触发Minor GC。它会将新生代中不再被引用的对象回收,通常是一个较为快速的过程。
- 常见收集器:几乎所有的垃圾回收器(如Serial GC、Parallel GC、G1 GC等)都对新生代进行垃圾回收。
1.2 老年代收集(Major GC/Old GC)
- 目标:仅回收老年代的垃圾。老年代区域存储的是生命周期较长的对象,这些对象通常已经从新生代晋升到老年代。
- 触发:当老年代的内存不足时,会触发Major GC。这个过程通常较为耗时,因为需要扫描更大范围的内存并且对象的生命周期较长,回收的对象也较少。
- 注意:“Major GC”这个术语在不同的资料中可能有不同的定义,有时它指的是仅回收老年代,有时则指回收整个堆(新生代和老年代)。因此在不同上下文中,需要仔细区分。
1.3 混合收集(Mixed GC)
- 目标:同时回收新生代和部分老年代的垃圾。这种方式结合了新生代收集和老年代收集的策略,但它并不回收整个堆。混合收集通常是为了提升回收效率,避免频繁的Major GC导致系统停顿过长。
- 常见收集器:目前只有G1(Garbage-First)收集器采用了这种方式。在G1收集器中,回收过程通过多个阶段进行,其中包括了对新生代和部分老年代的回收。
2. 整堆收集(Full GC)
整堆收集是指回收整个Java堆以及方法区的垃圾。Full GC通常是最后的回收手段,涉及的范围较大,因此回收时间较长,可能会对应用性能产生较大影响。
- 触发:Full GC可能由多个原因触发,例如当老年代空间不足或系统内存紧张时,JVM可能会触发一次Full GC。此外,一些回收器(如CMS和G1)在发生Minor GC时,如果新生代的内存无法容纳更多对象,也可能会触发Full GC。
- 影响:Full GC会暂停整个应用程序的执行,因此在高性能需求的环境中,频繁的Full GC是不被推荐的。
总结
Java垃圾回收的分类可以根据回收的范围和目标来划分为两大类:部分收集和整堆收集。部分收集包括新生代收集、老年代收集和混合收集,而整堆收集则会回收整个堆和方法区。了解不同类型的GC,有助于选择适合的垃圾回收策略,从而优化Java应用的性能。
原文地址:https://blog.csdn.net/qq_29752857/article/details/145323285
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!