关于 Java 对象生命的问题

2019-05-20 15:55:42 +08:00
 hastyfish
在容器中的对象有生命周期,在线程中的对象怎么弄死
1245 次点击
所在节点    问与答
9 条回复
zsam
2019-05-20 16:25:32 +08:00
java 好像没有提供立刻释放线程中对象所占的内存的显示调用吧。从编码上来讲,最直观的操作就是 对象赋值为 null, 但是这样也并不能立刻释放掉所占用的内存,因为 JVM 有统一的垃圾收集器来按照特定的算法来收集这些没有 “引用” 的对象的空间。至于什么时候回收掉,需要看对象在新生代还是老年代,以及对应空间的占用率。
hastyfish
2019-05-20 16:35:19 +08:00
@zsam
那我能不能简单的认为一个对象会活到这个线程结束
dying4death
2019-05-20 16:43:10 +08:00
骚年,看看 ThreadLocal 这个逼
MoHen9
2019-05-20 16:51:40 +08:00
Java 是自动回收内存,只要引用被释放掉就可以了,所有引用的地方置为 null 即可。
hastyfish
2019-05-20 16:55:28 +08:00
@MoHen9
引用设为 null 并不能立刻释放内存吧,我的意思是一个对象的生命周期是不是从实例化到所在线程结束
MoHen9
2019-05-20 17:07:53 +08:00
那就是楼上的 ThreadLocal 了,如果是自己创建的线程,也可以实现挂载在 thread 上的对象缓存,在 thread 结束后销毁。
hastyfish
2019-05-20 17:13:07 +08:00
@MoHen9
意思是全局对象可以用 ThreadLocal 在子线程中销毁,
而线程内的对象随着这个线程结束而销毁吧
MoHen9
2019-05-20 18:00:37 +08:00
@hastyfish ThreadLocal 持有的对象只能在对象被创建的线程销毁,你无法在 A 线程销毁 B 线程中 ThreadLocal 缓存的对象。也就是无法被全局销毁,即使你丢弃了 ThreadLocal 对象的引用也没用,只有缓存对象的线程才能释放引用。你可以看看 JDK 的代码,了解一下实现。
metrxqin
2019-05-20 20:52:32 +08:00
调用 System.gc()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/565875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX