什么是垃圾?
没有引用指向的任何对象都叫做垃圾。
如何寻找垃圾?
-
引用计数(reference count)
有几个引用指向某个对象,引用计数就是几。
如果引用计数为0,那么这个对象会被回收。
但是引用计数不是万能的,循环引用问题会导致没写垃圾不会被回收。
在对象被循环引用时,引用计数均不为0,但并没有任何引用指向这个整体。
-
根可达算法(Root Searching)
哪些是根对象?
- 线程栈变量
java程序从main方法开始执行,会起一个线程,这个线程会有线程栈,从main栈针开始的对象。 - 静态变量
class在加载到内存后,会对静态变量进行初始化,静态变量能够访问的到的对象。 - 常量池
某一个class会用到其他class的对象。 - JNI指针
java调用的C/C++本地方法所用到的对象。
第二部分传送门:JVM-垃圾、垃圾回收算法(2)