ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## Minor GC,MajorGC、Full GC JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。 针对Hotspot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(FullGC) * 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为: * 新生代收集(Minor GC / Young GC):只是新生代的垃圾收集 * 老年代收集(Major GC / Old GC):只是老年代的圾收集。目前,只有CMSGC会有单独收集老年代的行为。 * 注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。 * 混合收集(MixedGC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为 * 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。 ## 垃圾回收 ![](https://img.kancloud.cn/b0/51/b051c302f3436610887f7286035717dc_668x502.png) ### 各种引用的对比 #### 强引用 > 那各种引用在java中是怎么行成的呢? ### 2.4 不可达的对象并非“非死不可” 即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程。 1. 可达性分析法中不可达的对象被第一次标记并且进行一次筛选,筛选的条件是此对象`是否有必要执行 finalize 方法`。当对象没有覆盖 finalize 方法,或 finalize 方法已经被虚拟机调用过时,虚拟机将这两种情况视为没有必要执行。 2. `被判定为需要执行的对象将会被放在一个队列中进行第二次标记`,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。 ### 2.6 如何判断一个类是无用的类 方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢? 判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 `3 个条件`才能算是“**无用的类**”: * 该类所有的`实例`都已经被回收,也就是 Java 堆中不存在该类的任何实例。 * 加载该类的 `ClassLoader` 已经被回收。 * 该类对应的 java.lang.Class `对象没有在任何地方被引用`,无法在任何地方通过反射访问该类的方法。 虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。 ## 参考资料 1. [JVM 垃圾回收](https://snailclimb.gitee.io/2019/08/25/java/jvm/JVM%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/#toc-heading-8) 2. [垃圾回收相关概念](https://www.yuque.com/u21195183/jvm/nwkhey#3c482d26)