转载自Javdroider Hong的文章 -
知乎https://zhuanlan.zhihu.com/p/29074454
这位大侠讲解许多原理深入浅出,通俗易懂,推荐学习的小伙伴们关注。
主要记录这段方法:这里讲解了垃圾回收时的两种方式,引用计数法和更优化的可达性分析。
狗绳和垃圾回收
弄懂了myDog只是一条狗绳(引用),也有助于我们理解Java的垃圾回收机制,我在另一篇文章里提到过,一旦JVM发现一个对象跟GC Roots不可达时,这个对象就会被回收掉,看一下下面这段代码:
Dog dog = new Dog();
dog = null;
现在我们知道,dog=null就等于是把狗绳给咔嚓减掉了,这样狗就跑了,变成流浪狗了,就像Java中的对象被当做垃圾回收了一样。
接着再来看一下交叉引用的例子:
Dog dog1 = new Dog();
Dog dog2 = new Dog();
dog1.son = dog2;
dog2.father = dog1;
dog1 = null;
dog2 = null;
如果JVM采用的是引用计数法,那么狗2原先被dog2和dog1.son两个变量引用这,执行完dog2 = null之后,还被dog1.son引用,狗2是不会被回收的。
但是如果使用可达性分析法,我们就会发现,这两只狗和这个世界已经没有关联了,尽管他们俩还是父子关系,JVM对于这种互相引用,但是和GC ROOTS已经没有关联的对象,照样会进行回收。