`
有崖生110
  • 浏览: 53459 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java的垃圾回收机制

 
阅读更多


说到java的垃圾回收机制,大家可能都以为很简单,不就是那个啥的自动回收嘛,貌似还有个神马gc()和finalize()方法。但是深究起来,你真的很清楚具体是怎么一回事么?2个方法在什么时候用或者被调用?回收的到底是什么垃圾?具体的过程又是一个怎样的实现呢?还有诸如此类的细问题。。。


首先,我们必须明确一点,垃圾回收机制回收的到底是神马东西?就是所谓的垃圾是神马?

我们都知道,我们可以通过代码在堆中new一个对象,为它分配一个相应的内存空间。那么当这个对象没有被任何变量引用的时候,这个内存就变成了垃圾,等待GC的回收。注意,回收的是内存空间,而不是对象的本身。


那么,我们又怎么去回收这些垃圾呢?

finalize()方法:object类下的一个方法,主要是清理那些对象(并非使用new)获得了一块“特殊”的内存区域。程序员可以用finalize()来操作。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()的方法。并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存(先进行一次唤醒)。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。注意这里的finalize()并不是C++里的析构.在C++中,对象一定会被销毁,而在Java里的对象却并非总是被垃圾回收(1.对象可能不被垃圾回收(唤醒成功);2.垃圾回收并并不等于“析构”)。


finalize()在什么时候被调用?

有三种情况

1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候;

2.程序退出时为每个对象调用一次finalize方法;

3.显式的调用finalize方法

除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因。

就算你直接写了这个方法,你可能发现finalizer没有被调用,因为程序经常没有产生很多的垃圾来触发收集器。

http://www.iteye.com/topic/484934 友情链接,希望大家能看懂。。。


gc()方法:有java.lang.System.gc();也有java.lang.Runtime.getRuntime().gc()

这个2个都是object类子类的方法。。。

gc()它的作用就是启动一个垃圾回收器。而垃圾回收器才会调用其finalize()方法来进行垃圾的回收。

它一般是一个显示的请求,请求JVM进行垃圾回收。为这个命令只是建议JVM安排GC运行, 还有可能完全被拒绝. GC本身是会周期性的自动运行的,由JVM决定运行的时间。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics