java有没有"析构"函数呢?

lgb0532 2001-11-06 07:32:44
对于一个java类,可以使用其构造函数来初始化其参数,
一个类实例出了在其作用范围后系统将释放其资源,
请问java可不可以写一个函数让类实例被销毁时系统自动调用呢?
就象C++中的"析构"函数一样? 谢谢.
...全文
3117 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgb0532 2001-11-08
  • 打赏
  • 举报
回复
谢谢 hahaha88、lusxiao 以及各位的指点,
那么说来在cpu被占用的情况下先调用system.runFinalization(),再调用system.gc(),也并不能保证它一定会成功,问题是如果这么调用了,只要cpu空闲下来就会处理吗?
还有,如果我在一个线程里频繁做system.runFinalization()和system.gc(),对机器性能影响不大,是吗?谢谢~!
hahaha88 2001-11-07
  • 打赏
  • 举报
回复
析构除了可被用来释放内存资源之外,还可以用来释放其他资源,如socket资源,
thread资源/同步信号资源,文件资源,硬件资源。。。等。

好象只有finalize()方法会在该object被GCed的时候被系统自动调用。但何时
不保证(比如GC很晚才发生或根本没发生),由哪个线程出手来调用finalize()
也不规定,。。。故finalize()不是非常可靠的方法。

比较可靠的方法是自己写close方法,并在把该object设为null之前,自己主动地在
一个合适的线程里调用这个close方法
lgb0532 2001-11-07
  • 打赏
  • 举报
回复
谢谢各位的指点,我是想释放一个类实例占用的资源。
但是又不想调用其中的方法,而是要自动释放,所以想到了"析构".
现在已经找到了一个方法,
可以先调用system.runFinalization(),再调用system.gc()来触发重载了finalize()方法的类方法来释放资源,相当于"析构"。
但是不知道,如果一个线程起来后,隔一段时间这样运行一次,对系统性能有什么影响?
hy_yxj 2001-11-07
  • 打赏
  • 举报
回复
重载finalize()方法,之后在想要释放时或者超出作用域的时候调用System.gc()
lusxiao 2001-11-07
  • 打赏
  • 举报
回复
当你的程序有大量耗时运算,或主机环境有别的程序抢占cpu资源,以使你的jvm没有cpu时间片来运行垃圾收集线程(该线程优先级最低),就会有我和hahaha88兄的情况。

你的程序没有大量计算,或你的计算机较快所以每次都成功。因为system.gc()并不是直接启动垃圾收集,所以就算有影响,也不会有很多的性能损失。

本来finialize()就是用来给你释放某些外部资源的。比如,你用jni,其中分配了内存,那么内存的释放就可以放在finialize()(参见thinking in java)。
54sunboy 2001-11-07
  • 打赏
  • 举报
回复
没有!JAVA有垃圾收集器,如果要自己来做可以用finialize()
kfx 2001-11-07
  • 打赏
  • 举报
回复
finialize()
win_sharp 2001-11-07
  • 打赏
  • 举报
回复
thinking in java 中对这个问题有非常详细的描述,可以参看!
lgb0532 2001-11-07
  • 打赏
  • 举报
回复
但是我使用system.runFinalization(),再调用system.gc()每次都成功啊, 我现在是想知道这样对系统性能有什么影响,谢谢.
lusxiao 2001-11-07
  • 打赏
  • 举报
回复
java的垃圾收集是虚拟机管理的。调用system.gc()只是提醒jvm做垃圾收集,并不是一定会实现。这还引起了java高手的一场论战。所以没有必要隔一段时间运行一次System.gc。

因此finalize()并不一定会被调用。就象hahaha88兄说的一样。
lgb0532 2001-11-07
  • 打赏
  • 举报
回复
各位,来讨论一下吧,必定送分!
lgb0532 2001-11-07
  • 打赏
  • 举报
回复
各位,来讨论一下吧,必定送分!
waao 2001-11-06
  • 打赏
  • 举报
回复
没有,有释放资源的方法。如finalize()方法,垃圾回收过程中被系统自动调用。
hello_wyq 2001-11-06
  • 打赏
  • 举报
回复
内存管理都没有了,你要析够干什么?
yuppy_lew 2001-11-06
  • 打赏
  • 举报
回复
析构函数用不着你操心编译器会替你做这些繁琐的事的
totkid 2001-11-06
  • 打赏
  • 举报
回复
finalize()
Altair 2001-11-06
  • 打赏
  • 举报
回复
没有
有很多用public void destroy()释放资源

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧