java的一个优点就是不用程序员手动回收垃圾,虚拟机会自动帮用户进行操作.
那么虚拟机是如何知道这个对象已经无用可以被回收了那?
1.引用计数器(java虚拟机并不用他,有bug,太菜)
引用计数法,简单解释就是在对象上添加一个计数器,有人引用他就给他加1,引用失效了就减1,为0就是没人要的,就得被回收.
但是这种方法有bug,比如
我们这里有AA,BB两个对象,如果他俩都new对象 ,然后指定自己的bb属性为对方,那么他俩永远是1,也就不可能被回收了.
这样如果是使用程序计数器的就完犊子了.2.可达性分析算法
从字面上看,意思就是不可到达就该被回收了,那在虚拟机中是哪里到哪里那?
虚拟机中有个GC ROOTS(这是个泛称),我们一GC ROOTS为起点,想下搜索引用,当一个GC ROOTS对象没有与任何对象有引用链的存在,就证明这个对象不可用的.
那么究竟哪些对象可以做GC ROOTS那?
在虚拟机栈的栈帧中引用的对象,在方法区引用的对象,在本地方法栈引用的变量都可以作为GC ROOT.
未完待续...
网友评论