7.1. 垃圾的基本介绍

1)垃圾的定义
在堆中没有任何引用指向的对象,或者仅包含循环引用的多个对象,就是垃圾。
2)Java、C++的垃圾回收机制对比
Java C++
回收机制 自动回收垃圾 手动回收,可能会多次回收(非法访问)和忘记回收(内存泄漏)
优势 开发效率高 执行效率高
劣势 执行效率低 开发效率低
3)垃圾回收区域分类
根据分代模型的概念,垃圾回收可以分为两大类,而部分收集Partial GC又可以分为三类:
部分收集Partial GC 新生代收集Minor GC 只收集新生代中的垃圾
老年代收集Major GC 只回收老年代中的垃圾,目前只有CMS算法有
混合收集Mixed GC 对整个新生代和部分老年代回收,目前只有G1算法有
整堆收集Full GC 收集整个堆和方法区

4)垃圾回收对象
平常所说的垃圾回收是指堆中的垃圾回收,而Java虚拟机规范中没有对方法区的垃圾回收做出要求,因为性价比一般较低。
5)方法区中的垃圾回收
方法区(永久代)的垃圾主要回收两部分内容:废弃常量和无用的类。
a. 回收常量的方式:回收废弃常量与回收Java堆中的对象非常相似。以常量池中字面量的回收为例,若字符串“abc”已经进入常量池中,但当前系统没有任何String对象引用常量池中的“abc”常量,也没有其他地方引用该字面量,若发生内存回收,且必要的话,该“abc”就会被系统清理出常量池。常量池中其他的类(接口)、方法、字段的符号引用与此类似。
b. 不再使用的类需要满足3个条件:1)该类所有的实例都已经被回收,即Java堆中不存在该类的任何实例;2)加载该类的ClassLoader已经被回收;3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述3个条件的无用类进行回收,此处仅仅是“可以”,而并不是和对象一样(不使用了就必然回收)。