【问题标题】:Will garbage collection delete all objects created by a thread? [duplicate]垃圾回收会删除线程创建的所有对象吗? [复制]
【发布时间】:2020-06-06 23:02:51
【问题描述】:

我正在为一个大学项目使用 Java 套接字构建一个 Java 多人游戏,并且我已经达到了可玩的程度,但我不知道如何在游戏结束后释放资源。

服务器应该能够支持多个同时匹配,因此每次新游戏开始时,它都会分配自己的线程,然后生成用于游戏逻辑的所有对象。除了关闭套接字和输入/输出流之外,将终止主线程(如“到达运行方法的末尾”)标记我用于垃圾收集的游戏逻辑的所有对象,还是我必须一一删除引用避免内存泄漏?

从我的阅读来看,我的假设是正确的,我需要检查的是我创建的所有对象是否实际上只被主线程引用

【问题讨论】:

    标签: java multithreading sockets garbage-collection


    【解决方案1】:

    所有对象都分配在 JVM 管理的堆区域上。 只要一个对象被引用,JVM 就认为它是活动的。一旦某个对象不再被引用,因此应用程序代码无法访问该对象,垃圾收集器就会将其移除并回收未使用的内存。

    您可以使用一些 gc 标志来提高您的服务器性能。 最后,内存由垃圾收集器管理,您无能为力。

    【讨论】:

    • 我很清楚:我的问题不是关于性能,而是关于让我的程序正常工作。我不确定我的方法是否会导致内存泄漏:如果一个线程到达“run()”方法的末尾,它会释放它创建的所有对象吗?是否将不再引用它们,以便它们符合 GC 条件?或者只有当线程本身在到达“run()”方法的末尾时不再被引用时才会发生这种情况?
    • 如果他们没有与其他线程共享,是的,他们将有资格进行垃圾收集。但是你不应该太担心这个,我会告诉你为什么。您可以通过JVM profiler 轻松检查 GC 是否按预期工作或堆是否已满,您将能够看到哪些对象保持活动状态而不是死亡。你可以很容易地发现这些行为。此外,您可以使用代码分析来检查您是否正确管理资源。
    • @Jack 不需要“释放对象”。此外,哪个线程创建了对象也无关紧要。正如这个答案所说,对象是否可访问很重要。在这方面,您甚至不需要到达run() 方法的末尾;大多数对象可能会更早地被垃圾收集。通常,我们说仍在运行方法的局部变量可能会阻止对其所指对象的垃圾收集。但是,事实上,not even that is stopping gc 总体而言。基本规则是,当一个对象没有明显影响时,它可能会被收集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2012-07-23
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多