点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 - [JVM 垃圾回收](#jvm-垃圾回收) - [写在前面](#写在前面) - [本节常见面试题](#本节常见面试题) - [本文导火索](#本文导火索) - [1 揭开 JVM 内存分配与回收的神秘面纱](#1--揭开-jvm-内存分配与回收的神秘面纱) - [1.1 对象优先在 eden 区分配](#11-对象优先在-eden-区分配) - [1.2 大对象直接进入老年代](#12-大对象直接进入老年代) - [1.3 长期存活的对象将进入老年代](#13-长期存活的对象将进入老年代) - [1.4 动态对象年龄判定](#14-动态对象年龄判定) - [2 对象已经死亡?](#2-对象已经死亡) - [2.1 引用计数法](#21-引用计数法) - [2.2 可达性分析算法](#22-可达性分析算法) - [2.3 再谈引用](#23-再谈引用) - [2.4 不可达的对象并非“非死不可”](#24-不可达的对象并非非死不可) - [2.5 如何判断一个常量是废弃常量](#25-如何判断一个常量是废弃常量) - [2.6 如何判断一个类是无用的类](#26-如何判断一个类是无用的类) - [3 垃圾收集算法](#3-垃圾收集算法) - [3.1 标记-清除算法](#31-标记-清除算法) - [3.2 复制算法](#32-复制算法) - [3.3 标记-整理算法](#33-标记-整理算法) - [3.4 分代收集算法](#34-分代收集算法) - [4 垃圾收集器](#4-垃圾收集器) - [4.1 Serial 收集器](#41-serial-收集器) - [4.2 ParNew 收集器](#42-parnew-收集器) - [4.3 Parallel Scavenge 收集器](#43-parallel-scavenge-收集器) - [4.4.Serial Old 收集器](#44serial-old-收集器) - [4.5 Parallel Old 收集器](#45-parallel-old-收集器) - [4.6 CMS 收集器](#46-cms-收集器) - [4.7 G1 收集器](#47-g1-收集器) - [参考](#参考) # JVM 垃圾回收 ## 写在前面 ### 本节常见面试题 问题答案在文中都有提到 - 如何判断对象是否死亡(两种方法)。 - 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 - 如何判断一个常量是废弃常量 - 如何判断一个类是无用的类 - 垃圾收集有哪些算法,各自的特点? - HotSpot 为什么要分为新生代和老年代? - 常见的垃圾回收器有那些? - 介绍一下 CMS,G1 收集器。 - Minor Gc 和 Full GC 有什么不同呢? ### 本文导火索 ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-8-26/29176325.jpg) 当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 ## 1 揭开 JVM 内存分配与回收的神秘面纱 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 **堆** 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作**GC 堆(Garbage Collected Heap)**.从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。**进一步划分的目的是更好地回收内存,或者更快地分配内存。** **堆空间的基本结构:**