- 垃圾回收器(Garbage Collectors)
- 没有引用指向的对象就是垃圾
根搜索算法(ROOT Searching)
在方法里面有一些局部变量,我们new出一个对象(根对象),这个对象会产生一些引用形成新的对象,新的对象也可能产生一些引用形成新对象。
所以在运行时找到这个方法,只要能找到根对象就不是垃圾,找不到根对象的便是垃圾。
什么是根?
以下来自JVMS(Java虚拟机规范)
- JVM stack : 虚拟机栈中引用的对象
- native method stack : 本地方法栈中的对象
- runtime constant pool : 运行时常量池
- static references in method area : 静态引用的对象
- clazz
回收算法
- Mark-Sweep(标记压缩):
- 将垃圾标记出来,直接清除掉。
- 缺点:碎片化,会产生碎片,当分配大对象时可能会找不到空间
![](https://wobuaini.online/wp-content/uploads/2020/04/QQ截图20200424164418.png)
- Copying (拷贝):
- 将内存一分为二,只用一半
- 缺点:会造成内存浪费
![](https://wobuaini.online/wp-content/uploads/2020/04/QQ截图20200424164814.png)
- Mark-Compact(标记压缩):
- 将垃圾标记出来后,再进行一个压缩。利于产生新对象
- 缺点:效率低