java面试——垃圾回收机制

Java92

垃圾回收机制:——GC

初学java时。最经典的一句话是"java不像C,需要担心处理不用的内存,他有自己的垃圾回收,会自己处理的",这是当时老师上课提过的一嘴,随后就没有了下文,后面发现这玩意面试时还是挺爱问的。

顾名思义,垃圾回收就是释放垃圾占用的空间。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。
1、如何得知垃圾是什么?

与人脑不同的是,计算机可以自动识别垃圾是什么,它将只依赖它收到的指令来完成。他如何识别\

[En]

Unlike the human brain, the computer can automatically identify what garbage is, and it will only rely on the instructions it receives to complete. How does he identify

首先有一个 引入计数法——对一个对象添加引用计数器。每当有地方引用它时,计数器值加1;当引用失效时,计数器值减1.而当计数器的值为0时这个对象就不会再被使用,判断为已死。是不是简单又直观。然而,很遗憾。这种做法是错误的!为什么是错的呢?事实上,用引用计数法确实在大部分情况下是一个不错的解决方案,而在实际的应用中也有不少案例,但它却无法解决对象之间的循环引用问题。比如对象A中有一个字段指向了对象B,而对象B中也有一个字段指向了对象A,而事实上他们俩都不再使用,但计数器的值永远都不可能为0,也就不会被回收,然后就发生了内存泄露。

接着有一个 可达性分析——所有生成的对象都是一个称为"GC Roots"的根的子树。从GC Roots开始向下搜索,搜索所经过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链可以到达时,就称这个对象是不可达的(不可引用的),也就是可以被GC回收了。此算法解决了上述循环引用的问题。如A的对象和B的对象互相引用,但是他们都没有一个GC Roots的引用链可以到达,可以进行垃圾回收!

java面试——垃圾回收机制

1.1、可达性分析算法

不可达的对象将暂时处于"缓刑"阶段,要真正宣告一个对象死亡,至少要经历两次标记过程

  1. 如果对象在进行可达性分析后发现 没有与 GC Roots 相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行 finalize()方法。
输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长