浅谈 JAVA垃圾回收机制

JAVA垃圾回收机制

 

在公司里上班时间长了,只存在于应用的领域中,不看看JVM的原理,出去会被人鄙视的!

今天就大家一起学习一下 JAVA的垃圾回收机制吧!

 

JAVA是面向对象的语言,大家都知道对象初始化的重要性,但是对象创建了之后,不在需要了就要把它清除掉,所以垃圾回收就显得非常重要。

 

定义:JAVA 虚拟机会自动清除没有被引用的无用对象。

 

JAVA垃圾回收是有一个线程去自动执行,他与C++中的析构函数有很多不同之处,当你调用析构函数的时候,则被析构的对象一定会被清楚,但是在JAVA中对象并非总是被垃圾回收!

 

总结一下三点:

  1. 对象可能不被垃圾回收
  2. 垃圾回收不等于析构
  3. 垃圾回收只跟内存有关

 

先解释一下前两条,JAVA提供了一个垃圾回收的函数 finalize(),在触发垃圾回收的时候才会去调用finalize()这个方法,这就引出第三条,什么时候会触发垃圾回收呢,只有在内存处于临界状态的时候,才会去触发,这是正常的,因为垃圾回收会造成多余的开销,这也是一种开销,或者是随着程序的退出,那些资源也会全部交还给操作系统的!

 

其中system.gc()用于强制进行终结动作。

 

垃圾回收对JAVA对象存储空间的分配速度有利,因为java分配对象就像一个传送带一样,每次分配的时候堆指针都会很容易移动到更靠近传送带的开始处,可以通过垃圾回收器对对象重新排列,实现一种告诉的,有无限空间可供分配的堆模型。

 

 

垃圾回收技术:

  1. 引用计数发:当有引用连接对象的时候,计数器会加一,当对象失去引用或者为null的时候,计数器减一,当垃圾回收的时候,发现记数为0的就要被回收掉,

这种方式有几个缺点,1.这个过程在整个程序运行过程中都会持续的执行2.有的引用传递的对象不为0,但是需要进行清除,3.每次都要进行全扫描。

 

Java虚拟机采用一种自适应的方式

 

  1. 停止-复制
  2. 标记-清除

第一种方式就是适用于需要清除的对象比较多的情况下,需要先将程序暂定,然后将有效的全部复制到另外一片内存中,没有复制的就是需要清除的。

优点是:新堆是有序的,,一个一个的紧凑排列的

缺点是:当没有很多需要回收的对象时,也要进行复制

第二种方式     标记-清除

是遍历所有的引用,当引用为存活状态的时候,就进行标记,这个过程不会回收任何的对象,只有当全部标记完成之后才进行释放

优点是:当需要回收的对象比较少的时候效率会比较高

缺点是:剩下的对空间不是连续的,垃圾回收如果希望是连续空间的话,就要重新整理剩下的对象。

 

 

Java虚拟机还有很多附加的技术用以提升速度,与加载器操作有关的称为及时编译器,

  1. 将程序全部或部分翻译成本地机器码
  2. 惰性评估,即时编译器只在有必要的时候才编译代码
posted @ 2013-08-30 14:06  王超龙  阅读(682)  评论(0)    收藏  举报