关于Java垃圾回收我自己的理解

面试,一般都会问Java垃圾回收的原理和优点,还有什么方式方法什么的。网上一大堆东西,但是看得出来复制粘贴一大堆,含糊其辞,与其这样还不如自己总结一下的理解。我只是看过一点点《Java编程思想》,现在还没研究过JVM,有什么不对的,希望大佬能指出来。

Java垃圾回收就是释放程序不再使用的内存,也就是负责回收无用对象占据的内存。(粗体字为内容,括号内为解释)
原理思路:判断对象是否存活——》不存活的对象要回收——》如何回收,回收的方式有哪些。
垃圾回收器作为一个单独的低级别线程运行,对堆内已死亡或者长时间没有用的对象进行内存回收。他不是实时地针对某一对象或者所有对象进行垃圾回收。

判断对象是否存活:采用引用计数和可达性分析来判断对象是否存活
(引用计数,就是对引用连接对象计数器加1,置为Null或者离开作用域减1,减到0,判断引用对应的对象不存活,就把这引用连接的对象释放掉。
可达性分析,就是追溯引用遍历对象,任何活的对象都可以追溯到他到堆栈或者静态存储区的引用,这个过程可能是一个链条,穿过多层对象层次·。根据这个,我们就遍历所用的堆栈和静态存储区的引用能找到所有的活的对象。
其实引用计数和可达性分析,都是通过引用来判断引用连接的对象是否存活(可能不是直接连接,中间多个层次。),找到活的对象保留,释放无效的对象占用的内存空间。)

找到活的对象就要保留下去,我们通过多种内存回收方式进行保留存货的对象,无用的就对象就释放空间。

回收的方式有:标记-清楚算法,复制算法,标记整理算法,代收集算法。
(标记清除算法,两步走先标记可访问就是存活有效的对象,然后是清除,清除没有标记的对象。
复制算法,两块区域一样大,把用到的区域,有用的复制到另一块没用的区域,然后清除旧的区域。
标记整理算法:就不说了,第一种的改版
代收集算法:涉及到新生区和永生区,Java堆分为新生代和老年代,新生代大量对象在垃圾回收死亡。老年代中的对象会存活时间比较长,没有多余的空间担保,回收要用到标记清除,标记整理算法)

优点:a不需要考虑内存分配,b有效防止内存泄露,c因为垃圾回收机制,Java中只有引用有作用域的说法
(其实java垃圾回收只能监控new出来对象,像一些本地方法生成的对象空间他监控不了有就意味着还是可能内存泄露的,这就要用到finalize()方法来帮忙。Java垃圾回收与内存有关,并不一定会发生或者实时发生,有的程序结束了,也没发生Java的垃圾回收。)

猜你喜欢

转载自blog.csdn.net/feichangwurao/article/details/79635766