[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)
- 前言
- 第一部分 计算机网络与操作系统
- 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
- 性能占用
- 第二部分 Java基础
- 2-1 JVM
- JVM整体结构
- 方法区
- JVM的生命周期
- 堆对象结构
- 垃圾回收
- 调优案例
- 类加载机制
- 执行引擎
- 类文件结构
- 2-2 多线程
- 线程状态
- 锁与阻塞
- 悲观锁与乐观锁
- 阻塞队列
- ConcurrentHashMap
- 线程池
- 线程框架
- 彻底搞懂AQS
- 2-3 Spring框架基础
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高级编程
- Socket与NIO
- 缓冲区
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 认证授权
- 第四部分 数据存储
- 第1章 mysql篇
- MySQL主从一致性
- Mysql的数据组织方式
- Mysql性能优化
- 数据库中的乐观锁与悲观锁
- 深度分页
- 从一条SQL语句看Mysql的工作流程
- 第2章 Redis
- Redis缓存
- redis key过期策略
- 数据持久化
- 基于Redis分布式锁的实现
- Redis高可用
- 第3章 Elasticsearch
- 全文查询为什么快
- battle with mysql
- 第五部分 数据结构与算法
- 常见算法题
- 基于数组实现的一个队列
- 第六部分 真实面试案例
- 初级开发面试材料
- 答案部分
- 现场编码
- 第七部分 面试官角度
- 第八部分 计算机基础
- 第九部分 微服务
- OpenFeign工作原理