您的位置:首页 > 编程语言 > Java开发

Java的垃圾回收机制

2013-03-16 16:10 204 查看
今天复习了下《Thinking in Java》有关终结处理和垃圾回收的知识,这方面的知识没怎么用过,理解不是很透彻,拿出来小小的整理一下~

在C、C++中,要销毁对象总需要去用到析构函数(无论是自动调用还是delete去销毁new创建的对象),如果忘了delete那就悲剧了~。而java中所有的对象必须要通过new来获得,并且由垃圾回收机制来销毁,这也是java由于c++的地方之一。然而垃圾回收并不能完全代替析构函数的作用,我自己将java中的垃圾处理分成两块来看:一是清理java中new创建的对象,二是对象(并非使用new)获得“特殊”内存。《Thinking
in Java》中提到了三句话:

1. 对象可能不被垃圾回收;

2. 垃圾回收并不等于“析构”;

3. 垃圾回收只与内存有关;

在具体分析之前需要了解java中是如何存储对象实例的——堆存储(C、C++是放在堆栈里的),没分配一个新对象,它就往前移动一格,而垃圾回收装置就是一面回收空间,一面使堆中的对象紧凑的排列,让堆就像一个运行良好的传送带一样。

PS:

java中主要存在4块内存空间:

栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)

堆内存空间:保存每个对象的具体属性内容。

全局数据区:保存static类型的属性。

全局代码区:保存所有的方法定义。

再来看垃圾回收,Java中的垃圾回收实际上被视为低优先权的后台进程,在运行中并不是说一个对象不用了,over了,就立即调用垃圾回收(这显然会降低编译运行的速度)。现实的情况是,Java虚拟机采用自适应的垃圾回收技术,并在“停止—复制”和“标记—清扫”之间来回倒腾(两者都需要暂停程序才能执行,后者在只会产生少量垃圾的情况下执行,前者在碎片较多时执行)。

对于特殊的情况,比如书中提到的“本地方法”,需要用到finalize(),然而这个东西常常隐藏着未知的危险(反正我是不知道啦~),finalize()作为终结函数可以在程序结束时(你可以通过System.gc()来让它在内存没有堆满的时候运行),可以用来做一些有趣的事情。。。

只言片语,小小总结下~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: