前言

相信大家都听说过JVM垃圾回收机制,大概就是当我们的内存满了的话就会进行垃圾回收机制,将不再用到的对象清理掉,这样我们的内存就又可以有空间存东西了,那么JVM怎么能够知道哪些对象不再用到了呢?下面我来用一个小故事讲解一下。

小故事

李老板开了一个小超市,但是自己平时特别忙,就雇佣了一个管家来看店,平时管家一个人还可以忙的过来,但是快要过年了,大家都来买年货了,管家一个人忙不过来了,然后李老板就找了两个假期短工,一个是学生小明,一个是小明的老师老王,但是呢这两个都需要管家去面试,李老板因为在外地谈生意就直接打电话让两个假期短工直接去超市找管家面试,这里管家只能要一个人,管家想了想觉得学生又便宜又听话,所以就要了学生。到目前为止理论上老师没有面试上就应该回家了,但是在这里管家没有权利让老师回家,老师就赖在店里不走了,老师也不干活也不领工资就是占个座位睡大觉。这个时候店里越来越忙了,这时李老板从外地回来了而且还带回来一个更便宜的假期工小红,但是超市只能容纳三个人,目前已经满了,分别是管家、学生小明、睡觉的老师老王,这个时候李老板就问管家:“你招收了哪个人做假期工了啊!”。管家指向了学生小明,然后李老板知道睡觉的老师老王没有用了,就把他撵出去了,然后李老板让小红进来工作了。

解析

JVM怎样判断是垃圾对象进行垃圾回收_jvm

通过上面的小故事我们来理解一下上面这个图片,上面的图片中person对应管家、student对应小明、teacher对应老师老王,为什么我们在这里要把student和teacher都new出来呢,因为一开始李老板也不知道要哪个人,所以都让他们去超市里面试去了,所以两个人都得new出来,然后再超市里管家招收了学生,就相当于指向了学生一个引用,然后李老板就把老师撵出来了,在这里管家相当于专有名词来说就是“GCRoot根”,而李老板就相当于JVM中用来执行垃圾收集的方法,所以说JVM判断一个对象是不是垃圾就看它有没有被GCRoot根对象引用。

可达性分析算法

上述例子他有一个专有名词叫做“可达性分析算法”,就是通过GCRoot根出发,看看能不能达到一个对象,如果能达到就不是垃圾对象,如果不能达到就是垃圾对象,我们的一个指向就相当于一个小路,由于李老板在问管家招收了谁的时候,管家指向了学生小明,所以学生小明不是垃圾对象就不会被清理,而管家没有指向老师老王,所以老王就相当于垃圾对象就会被清理掉。

总结

所以在java中一个对象不再被使用的时候是不能被立马清理的,必须等李老板(jvm垃圾清理方法)来清理,那么李老板必须等人满了才会过来清理,不满的话是不会过来清理的,所以jvm垃圾清理执行的前提是内存满了,但是垃圾清理方法是会造成系统短暂停顿的,所以我们在jvm调优的时候就是为了尽量不让jvm执行垃圾清理方法。