Java的垃圾回收机制

今天复习了下《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()来让它在内存没有堆满的时候运行),可以用来做一些有趣的事情。。。

只言片语,小小总结下~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值