Java Tomcat中的多线程

Java Tomcat中的多线程,java,multithreading,tomcat6,Java,Multithreading,Tomcat6,我有多线程应用程序。每2分钟激活3个线程,在套接字编程的帮助下,我们从远程位置写入数据。它工作得很好。但随着时间的增加,记忆也在增加。在某个阶段,我的应用程序崩溃了。我需要在一天内重新启动ApacheTomcat服务器twise。根据我记忆中没有释放的线程。我尝试将未使用的对象设为null,并编写system.gc()。但问题仍然没有解决 你可以做很多事情来解决这个问题。例如: 您的线程可能并不总是终止 如果您使用的是线程池,则可能是通过线程局部变量累积垃圾 这可能只是一个“普通”的Java内

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

你可以做很多事情来解决这个问题。例如:

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

  • 如果您使用的是线程池,则可能是通过线程局部变量累积垃圾

  • 这可能只是一个“普通”的Java内存泄漏;e、 g.有意或无意地在“全局”数据结构中积累大量对象

我建议如下:

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

  • 按照Java中检查内存泄漏的正常过程进行操作


跟进


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

当线程终止时,堆栈将自动释放,
线程
对象本身的所有有效字段都为空,包括对线程本地映射的引用和对
可运行
的引用(如果您提供了一个)。这只留下在
线程
子类中定义的字段。如果去掉应用程序对线程对象的引用,它们将变得不可访问

换句话说,如果线程已终止,那么内存泄漏是由应用程序保留对不再需要的内容的引用而导致的“普通”内存泄漏


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

system.gc()
如果您的应用程序正在维护对对象的强引用,我们就帮不了您……您忘记问问题了。如果您要求我们帮助您调试代码,那么调试看不到的代码非常困难。请尝试使用收集和分析堆转储。运行或对照您的代码不会有任何伤害。事实上,我是线程新手。。请告诉我如何检查线程是否终止?当
run()
方法返回时,或者当线程由于未处理的异常而死亡时,线程终止。根据我的情况,线程终止后不会释放内存。你知道如何从线程中释放内存吗?你需要解释你在做什么,你的问题很模糊