浏览 5387 次
锁定老帖子 主题:java的清理工作
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (13)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-05
java的垃圾回收器虽然负责回收无用对象占用的内存资源,但也有特殊情况:当你的对象并非是用new获得内存区域,垃圾回收器将不知道该如何释放该对象的这块“特殊的内存区域”。为了解决这个情况,java允许在类中定义一个名为finalize()方法,并且在下一次垃圾回收动作发生的时候,才会真正回收对象占用的内存。 finalize()不应该被用作通用的清理方法,之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非java中的通常做法。(这种情况主要发生在使用“本地方法”的情况下)对于“本地方法”自己也不是太明白,好像意思就是java可以调用其他语言写的代码,在非java代码中,可能会调用类似于C中malloc()这样的函数,这些函数除非使用free()函数(这个是C和C++中的),否则不会得到释放。所以要使用finalize()用本地方法调用free()函数,这样当垃圾回收器的回收动作发生时,才会通过finalize()释放这些内存资源。 最后只得一提的是,无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果java虚拟机(JVM)并未面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-06
1.gc只负责jvm内部分配的资源,所以如果通过jni获取了系统资源,肯定无法自动回收.
2.finalize()方法相当难用,因为这涉及到了object在jvm中的生存期细节问题,除非做基础架构的,否则还是自己去显式的管理费jvm资源. |
|
返回顶楼 | |
发表时间:2010-04-06
配置好自己的JVM吧,JNI那边让C程序员写好点
|
|
返回顶楼 | |
发表时间:2010-04-06
如果可以,永远不要用finalize,既然不能保证什么时候finalize,你还显示的往里面塞代码做甚
如果可以,永远不要用System.gc(),你有3种XXReference可以使用,目的就是保证GC的 如果可以,对于你自己的应用你应该选择相应的GC方法,无论是throughout还是pause time,现在有大几十种GC参数可以选择。 如果可以,请优化你的代码,不要让我看到你的while循环里面没有Thread.sleep,或者没有局部变量=null |
|
返回顶楼 | |
发表时间:2010-04-06
坚决不使用finalize()和.gc(). JNI让该考虑的人考虑去
|
|
返回顶楼 | |
发表时间:2010-04-06
在程序中为什么要显式地调用finalize()方法了?
难道只是因为不能确保对象每次都会回收吗? C++中是需要显式地调用回收方法的,而java中在这一点进行了改进,垃圾回收的事不需要由程序员去处理了。 |
|
返回顶楼 | |
发表时间:2010-04-06
一般不显示的调用gc~
|
|
返回顶楼 | |
发表时间:2010-04-06
对gc 不了解, 来学习的
|
|
返回顶楼 | |
发表时间:2010-04-06
说真的,自己也不是很了解,学习中。
|
|
返回顶楼 | |
发表时间:2010-04-06
beneo 写道 如果可以,永远不要用finalize,既然不能保证什么时候finalize,你还显示的往里面塞代码做甚
如果可以,永远不要用System.gc(),你有3种XXReference可以使用,目的就是保证GC的 如果可以,对于你自己的应用你应该选择相应的GC方法,无论是throughout还是pause time,现在有大几十种GC参数可以选择。 如果可以,请优化你的代码,不要让我看到你的while循环里面没有Thread.sleep,或者没有局部变量=null 可以说详细点吗? |
|
返回顶楼 | |