-1

我有多线程应用程序。每 2 分钟激活 3 个线程,在套接字编程的帮助下,我们正在从远程位置写入数据。它工作正常。但随着时间的增加,内存也在增加。在某个阶段,我的应用程序崩溃了。我需要在一天内重新启动我的 apache tomcat 服务器两次。根据我的记忆,没有被线程释放。我尝试将未使用的对象设为 null 并编写 system.gc()。但问题仍未解决。

4

1 回答 1

1

你可以做很多事情来解决这种情况。例如:

  • 您的线程可能并不总是终止。

  • 如果您使用的是线程池,您可能会通过线程本地来积累垃圾。

  • 这可能只是“普通”的 Java 内存泄漏;例如,有意或无意地在“全局”数据结构中累积大量对象。

我推荐以下内容:

  • 进行线程转储以查看是否有很多卡住的线程。

  • 按照正常的程序检查 Java 中的内存泄漏。


跟进

根据我的情况,线程在终止后不会释放内存。知道如何从线程中释放内存吗?

当线程终止时,堆栈会自动释放,并且Thread对象本身的所有重要字段都为空,包括对线程本地映射的引用和对Runnable(如果您提供了)的引用。这只会留下您在Thread子类中定义的字段。如果您摆脱应用程序对线程对象的引用,它们将变得无法访问。

换句话说,如果线程已经终止,那么内存泄漏是一种“普通”泄漏,这是由您的应用程序保留对不再需要的事物的引用引起的。

但是,如果您不向我们展示代码,我们将无法真正帮助您。

于 2013-08-09T05:46:16.180 回答