论坛首页 入门技术论坛

java的清理工作

浏览 5387 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (13)
作者 正文
   发表时间:2010-04-05  
一直都认为java的垃圾清理器可以把这个工作给完完整整的给解决,没想到还是有一定的问题的。



java的垃圾回收器虽然负责回收无用对象占用的内存资源,但也有特殊情况:当你的对象并非是用new获得内存区域,垃圾回收器将不知道该如何释放该对象的这块“特殊的内存区域”。为了解决这个情况,java允许在类中定义一个名为finalize()方法,并且在下一次垃圾回收动作发生的时候,才会真正回收对象占用的内存。



finalize()不应该被用作通用的清理方法,之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非java中的通常做法。(这种情况主要发生在使用“本地方法”的情况下)对于“本地方法”自己也不是太明白,好像意思就是java可以调用其他语言写的代码,在非java代码中,可能会调用类似于C中malloc()这样的函数,这些函数除非使用free()函数(这个是C和C++中的),否则不会得到释放。所以要使用finalize()用本地方法调用free()函数,这样当垃圾回收器的回收动作发生时,才会通过finalize()释放这些内存资源。



最后只得一提的是,无论是“垃圾回收”还是“终结”,都不保证一定会发生。如果java虚拟机(JVM)并未面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的。

   发表时间:2010-04-06  
1.gc只负责jvm内部分配的资源,所以如果通过jni获取了系统资源,肯定无法自动回收.
2.finalize()方法相当难用,因为这涉及到了object在jvm中的生存期细节问题,除非做基础架构的,否则还是自己去显式的管理费jvm资源.
0 请登录后投票
   发表时间:2010-04-06  
配置好自己的JVM吧,JNI那边让C程序员写好点
0 请登录后投票
   发表时间:2010-04-06  
如果可以,永远不要用finalize,既然不能保证什么时候finalize,你还显示的往里面塞代码做甚

如果可以,永远不要用System.gc(),你有3种XXReference可以使用,目的就是保证GC的

如果可以,对于你自己的应用你应该选择相应的GC方法,无论是throughout还是pause time,现在有大几十种GC参数可以选择。

如果可以,请优化你的代码,不要让我看到你的while循环里面没有Thread.sleep,或者没有局部变量=null

0 请登录后投票
   发表时间:2010-04-06  
坚决不使用finalize()和.gc(). JNI让该考虑的人考虑去
0 请登录后投票
   发表时间:2010-04-06  
在程序中为什么要显式地调用finalize()方法了?
难道只是因为不能确保对象每次都会回收吗?
C++中是需要显式地调用回收方法的,而java中在这一点进行了改进,垃圾回收的事不需要由程序员去处理了。
0 请登录后投票
   发表时间:2010-04-06  
一般不显示的调用gc~
0 请登录后投票
   发表时间:2010-04-06  
对gc 不了解, 来学习的
0 请登录后投票
   发表时间:2010-04-06  
说真的,自己也不是很了解,学习中。
0 请登录后投票
   发表时间:2010-04-06  
beneo 写道
如果可以,永远不要用finalize,既然不能保证什么时候finalize,你还显示的往里面塞代码做甚

如果可以,永远不要用System.gc(),你有3种XXReference可以使用,目的就是保证GC的

如果可以,对于你自己的应用你应该选择相应的GC方法,无论是throughout还是pause time,现在有大几十种GC参数可以选择。

如果可以,请优化你的代码,不要让我看到你的while循环里面没有Thread.sleep,或者没有局部变量=null



可以说详细点吗?
1 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics