如何判断对象可以回收
引用计数法: 定义一个计数器,记录变量当前被引用的数量,当数为0时即不被引用时,就回收
缺点: 如:对象互相引用会导致计算器不能归零
(java现在使用的垃圾回收算法)
可达性分析算法: 先统一扫描,确定一系列根对象,(根对象:一定不能被垃圾回收的对象)
如果一个对象没有被根对象 直接或者间接 的使用,就会被垃圾回收
哪些对象可以作为根对象?
分析方式:
可以用 jmap 和内存分析工具Memory Analyzer(MAT)来分析
jmap -dump:format=b,live,file=1.bin 线程id
用jmap将当前线程信息抓取个快照,变成文件1.bin,然后用MAT分析
根对象: System.class 核心类加载器等系统类
:Object,String,HashMap等类
Native Stack 本地方法类
:计算机底层的一些操作系统方法,可能是用c,cpp写的
Busy Monitor 正在加锁的对象
Thread: 正在活动的线程中使用的对象
简单讲,被常量、静态变量、全局变量、运行时方法中的变量直接引用的对象,原则上不能被GC释放。