【TIJ】JAVA垃圾回收和finalize()

我针对Java垃圾回收机制在论坛上写了下我的理解和疑问,很多朋友给与了回复,现在贴在博客上,供大家参考:

(黑色字体是博主写的,红色是@ygycomon 童鞋给我的回复)

——————————————————————————————————————————————————————————————————

JAVA的垃圾回收机制是不是可以这么理解:

(1)对象所占用的内存空间(通常是经由new创建,在堆中),是由垃圾回收器负责回收;但是这种回收并不一定会发生,JAVA中的对象并不一定会被销毁;内存空间如果没用完,垃圾回收也许永远不会执行。
gc是有触发条件的,当一个小对象准备要在新生代被创建的时候,如果这时发现新生代满了,那么会触发一次minor gc。老年代类似,只不过触发的是full gc
(2)而对于非“创建对象”分配的内存,JAVA的finalize()方法派上用场。JAVA中一切皆为对象,所谓的“非创建对象”分配的空间,是指调用“本地方法”获得的空间分配,比如C语言中malloc函数分配的内存,需要free()方法释放内存,但是free()是C和C++中的方法,因此需要用finalize()调用本地方法来完成这种空间的清理。
finalize并不是用来释放诸如本地方法持有的资源。设计者原本的意思是效仿c/c++里的析构,但是事实上finalize被证明不是一个有效的手段。所有现在的 规范里都是建议不要用这个方式来释放资源
(3)finalize()方法是在垃圾回收器执行回收之前调用的。但是垃圾回收并不一定会执行,因此finalize()并不一定会被调用。因此,finalize()方法并不能用于通用清理工作。
finalize的失效通常是,当一个对象准备要回收的时候,系统会调用,但是finalize只会被调用一次,这意味着如果准备回收而对象没有被回收的话,这个对象可以继续工作,但是其之后持有的资源却不能用finalize来释放。这就是finalize不能有效释放资源的原因
(4)Java中的垃圾回收不同于C++中的析构函数。、
absolutely right! 本质的区别就是,java希望使用者不要在应用的层面来关注底层资源有没有被释放。在新的jdk版本中,甚至连io这种资源都能做到自动释放。意义就是,更加关注业务层面的实现,而不是底层

以上是我的理解,不知道有哪些不对。另外,我有一些疑惑是:
(1)finalize()的调用是与垃圾回收器的执行相关联的。而垃圾回收器只是负责回收对象所占用内存,也就是说,当对本地方法分配的内存进行清理时,是不需要垃圾回收器的,那么是如何触发finalize()方法工作的?
本地方法的资源如何管理的,这个我也没有研究过
(2)垃圾回收器是对堆中对象分配的空间进行清理,那么堆栈中的空间分配(对象引用、基础类型变量)是如何清理的?(答案是否是这样:因为堆中的变量是不知道存活时间常短的,因此需要适时的回收,而堆栈中的变量都是明确知道生命周期的,因此当其生命周期结束时,自然就清理)。
栈是线程私有的,线程结束了,栈就没了。线程里执行的方法里的临时变量,执行完了就销毁了
(3)垃圾清理真的是将相应的存储空间清空吗?

不能说是清空吧,可能用“清理、整理”来描述更确切。本质上是自动探测,将无用的内存释放出来,有用的保留

——————————————————————————————————————————————————

看到一篇博文《Java对象的生命周期》,写得很详细,推荐给大家,应该能帮大家解释很多问题。


@longtian1213 大神推荐了《深入理解Java虚拟机:JVM高级特性与最佳实践》第3章的内容,我认为值得一读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值