浅谈 JAVA垃圾回收机制
JAVA垃圾回收机制
在公司里上班时间长了,只存在于应用的领域中,不看看JVM的原理,出去会被人鄙视的!
今天就大家一起学习一下 JAVA的垃圾回收机制吧!
JAVA是面向对象的语言,大家都知道对象初始化的重要性,但是对象创建了之后,不在需要了就要把它清除掉,所以垃圾回收就显得非常重要。
定义:JAVA 虚拟机会自动清除没有被引用的无用对象。
JAVA垃圾回收是有一个线程去自动执行,他与C++中的析构函数有很多不同之处,当你调用析构函数的时候,则被析构的对象一定会被清楚,但是在JAVA中对象并非总是被垃圾回收!
总结一下三点:
- 对象可能不被垃圾回收
- 垃圾回收不等于析构
- 垃圾回收只跟内存有关
先解释一下前两条,JAVA提供了一个垃圾回收的函数 finalize(),在触发垃圾回收的时候才会去调用finalize()这个方法,这就引出第三条,什么时候会触发垃圾回收呢,只有在内存处于临界状态的时候,才会去触发,这是正常的,因为垃圾回收会造成多余的开销,这也是一种开销,或者是随着程序的退出,那些资源也会全部交还给操作系统的!
其中system.gc()用于强制进行终结动作。
垃圾回收对JAVA对象存储空间的分配速度有利,因为java分配对象就像一个传送带一样,每次分配的时候堆指针都会很容易移动到更靠近传送带的开始处,可以通过垃圾回收器对对象重新排列,实现一种告诉的,有无限空间可供分配的堆模型。
垃圾回收技术:
- 引用计数发:当有引用连接对象的时候,计数器会加一,当对象失去引用或者为null的时候,计数器减一,当垃圾回收的时候,发现记数为0的就要被回收掉,
这种方式有几个缺点,1.这个过程在整个程序运行过程中都会持续的执行2.有的引用传递的对象不为0,但是需要进行清除,3.每次都要进行全扫描。
Java虚拟机采用一种自适应的方式
- 停止-复制
- 标记-清除
第一种方式就是适用于需要清除的对象比较多的情况下,需要先将程序暂定,然后将有效的全部复制到另外一片内存中,没有复制的就是需要清除的。
优点是:新堆是有序的,,一个一个的紧凑排列的
缺点是:当没有很多需要回收的对象时,也要进行复制
第二种方式 标记-清除
是遍历所有的引用,当引用为存活状态的时候,就进行标记,这个过程不会回收任何的对象,只有当全部标记完成之后才进行释放
优点是:当需要回收的对象比较少的时候效率会比较高
缺点是:剩下的对空间不是连续的,垃圾回收如果希望是连续空间的话,就要重新整理剩下的对象。
Java虚拟机还有很多附加的技术用以提升速度,与加载器操作有关的称为及时编译器,
- 将程序全部或部分翻译成本地机器码
- 惰性评估,即时编译器只在有必要的时候才编译代码