首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

关于 Java 对象生命的问题

  •  
  •   hastyfish · 60 天前 · 654 次点击
    这是一个创建于 60 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在容器中的对象有生命周期,在线程中的对象怎么弄死
    9 回复  |  直到 2019-05-20 20:52:32 +08:00
        1
    zsam   60 天前   ♥ 1
    java 好像没有提供立刻释放线程中对象所占的内存的显示调用吧。从编码上来讲,最直观的操作就是 对象赋值为 null, 但是这样也并不能立刻释放掉所占用的内存,因为 JVM 有统一的垃圾收集器来按照特定的算法来收集这些没有 “引用” 的对象的空间。至于什么时候回收掉,需要看对象在新生代还是老年代,以及对应空间的占用率。
        2
    hastyfish   60 天前
    @zsam
    那我能不能简单的认为一个对象会活到这个线程结束
        3
    dying4death   60 天前   ♥ 1
    骚年,看看 ThreadLocal 这个逼
        4
    MoHen9   60 天前 via Android
    Java 是自动回收内存,只要引用被释放掉就可以了,所有引用的地方置为 null 即可。
        5
    hastyfish   60 天前
    @MoHen9
    引用设为 null 并不能立刻释放内存吧,我的意思是一个对象的生命周期是不是从实例化到所在线程结束
        6
    MoHen9   60 天前 via Android
    那就是楼上的 ThreadLocal 了,如果是自己创建的线程,也可以实现挂载在 thread 上的对象缓存,在 thread 结束后销毁。
        7
    hastyfish   60 天前
    @MoHen9
    意思是全局对象可以用 ThreadLocal 在子线程中销毁,
    而线程内的对象随着这个线程结束而销毁吧
        8
    MoHen9   60 天前 via Android
    @hastyfish ThreadLocal 持有的对象只能在对象被创建的线程销毁,你无法在 A 线程销毁 B 线程中 ThreadLocal 缓存的对象。也就是无法被全局销毁,即使你丢弃了 ThreadLocal 对象的引用也没用,只有缓存对象的线程才能释放引用。你可以看看 JDK 的代码,了解一下实现。
        9
    metrxqin   60 天前 via Android
    调用 System.gc()
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2261 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 14:31 · PVG 22:31 · LAX 07:31 · JFK 10:31
    ♥ Do have faith in what you're doing.