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

lgb0532 2001-11-06 07:32:44
对于一个java类,可以使用其构造函数来初始化其参数,
一个类实例出了在其作用范围后系统将释放其资源,
请问java可不可以写一个函数让类实例被销毁时系统自动调用呢?
就象C++中的"析构"函数一样? 谢谢.
...全文
3068 17 打赏 收藏 举报
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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()释放资源
  • 打赏
  • 举报
回复
相关推荐
普通用户管理模块: (1)用户注册登录:用户注册为用户并登录校园学生兼职系统;用户对个人信息的增删改查,比如个人资料,密码修改。 (2)查看校园学生兼职系统的首页信息:校园学生兼职系统的首页信息包含了首页、公告消息、兼职中心、兼职资讯、我的账户、我的收藏等。 (3)公告栏:在首页导航栏上我们会看到“校园论坛”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的公告信息; (4)兼职资讯:在首页导航栏上我们会看到“兼职疫资讯”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的兼职疫资讯信息,能够对喜欢的兼职资讯进行点赞,如果下次想要更快的找到这篇资讯,也可以进行收藏、评论; (5)兼职中心:在首页导航栏上我们会看到“兼职信息”这一菜单,我们点击进入进去以后,会看到所有管理员在后台发布的兼职苗信息,我们选择想要了解兼职信息,查看兼职详情信息,可以评论+点赞+收藏; (6)我的收藏:在“我的”下可以查看管理“我的收藏”信息,可以查看收藏,也可以对不喜欢的信息进行删除收藏; 管理员管理模块: (1)登录:管理员的账号是在数据表表中直接设置生成的,不需要进行注册; ……
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2001-11-06 07:32
社区公告
暂无公告