【问题标题】:How to reclaim the memory used by a Java thread stack?如何回收 Java 线程堆栈使用的内存?
【发布时间】:2010-12-01 12:59:59
【问题描述】:

我这几天一直有这个内存泄漏问题,我想我现在有了一些线索。我的 java 进程的内存不断增长,但堆没有增加。有人告诉我,如果我创建许多线程,这是可能的,因为 Java 线程使用堆外的内存。

我的 java 进程是一个服务器类型的程序,所以有 1000-2000 个线程。正在创建和删除。如何回收 java 线程使用的内存?我是否只是删除对线程对象的所有引用并确保它被终止?

【问题讨论】:

    标签: java optimization memory memory-management memory-leaks


    【解决方案1】:

    是的。这就是答案。只要存在对任何 Java 对象的活动引用,那么该对象在完成后就不会被垃圾回收。 如果您正在创建和销毁线程而不是池化它们,我认为您还有其他问题。

    【讨论】:

      【解决方案2】:

      来自 Java API 文档的线程在以下情况下死亡:

      所有不是守护线程的线程都已经死亡,要么从调用 run 方法返回,要么抛出传播到 run 方法之外的异常。

      线程在从 run() 方法返回时死亡。当他们死去时,他们是垃圾收集的候选者。您应该确保您的线程释放对对象的所有引用并退出 run() 方法。

      我不认为对线程的引用无效。

      您还应该查看 Java 5 及更高版本中的新线程工具。检查 API 文档 here 中的包 java.util.concurrent

      我还建议您查看本书Concurrency in Practice。它对我来说是无价的。

      【讨论】:

      • “当它们死亡时,它们是垃圾回收的候选对象”,但前提是没有其他对象仍然持有对这些死线程的引用。
      【解决方案3】:

      有两件事会导致线程不被垃圾回收。

      1. 任何还活着的线程都不会被垃圾回收。在Thread.start() 调用的run 方法正常退出或抛出异常之前,线程一直处于活动状态。一旦发生这种情况(并且线程的未捕获异常处理程序已经完成),线程就死了。

      2. 对线程的 Thread 对象的任何实时引用都会阻止它被垃圾回收。实时引用可能在您的代码中,或者如果您使用线程池,它们可能是池数据结构的一部分。


      我的 java 进程的内存不断增长,但堆没有增加。

      那是因为每个线程都有一个大的(例如 1Mb)堆栈段,没有在 Java 堆中分配。

      线程的堆栈段仅在线程启动时分配,并在线程终止时立即释放。这同样适用于(我认为)线程的线程本地映射。不“活动”的 Thread 对象根本不会使用太多内存。


      所以总结一下。您似乎有很多实时线程。只要它们还活着,它们就不会被垃圾回收,而让它们释放内存的唯一方法就是让它们死去……不知何故。

      要减少内存使用,您需要执行以下一项或多项操作:

      • 查看线程代码(run() 方法等)以找出它们仍然存在的原因。
      • 减小线程堆栈的大小。 (理论上,您可以低至 64K ...)
      • 重新设计您的应用程序,使其不会创建数千个线程。 (线程池和某种工作队列是一种可能的方法。)

      【讨论】:

      • 如果我在一个巨大的对象列表中循环并将这些对象传递给我的线程池的 run() 方法,是引用被传递还是整个对象留在队列中?
      【解决方案4】:

      这是很多线程,每个线程都会产生内存开销,以及用于管理它们的其他资源(上下文切换等)。使用分析器查看线程活动 - 您可能会发现大多数线程大部分时间都处于空闲状态。

      我建议第一步是使用 java.util.concurrent 提供的线程池来管理线程。与其创建线程,不如创建移交给池的任务。调整池,直到您有更少数量的线程保持相当繁忙。这可以很好地解决内存问题;它肯定会提高性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-20
        • 2017-12-21
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        相关资源
        最近更新 更多