我已经有好几天的记忆泄漏问题了,我想我现在有了一些线索。我的java进程的内存不断增加,但是堆却没有增加。我被告知,如果我创建了许多线程,这是可能的,因为Java线程使用堆之外的内存。
我的java进程是一个服务器类型的程序,所以有1000-2000线程。正在创建和删除。如何回收java线程使用的内存?我是否只是擦除对线程对象的所有引用并确保它被终止?
发布于 2009-09-25 19:45:42
是。这就是答案。只要有对任何Java对象的活动引用,那么该对象在完成时就不会被垃圾收集。如果您正在创建和销毁线程,而不是集中它们,我认为您也有其他问题。
发布于 2009-09-25 20:22:26
发布于 2009-09-26 03:23:15
有两件事会导致线程不被垃圾收集。
Thread.start()调用的Thread.start()方法退出为止(正常情况下或通过抛出异常)。一旦发生这种情况(并且线程的非正常异常处理程序已经完成),线程就死了。我的java进程的内存不断增加,但堆却没有增加。
这将是因为每个线程都有一个没有在Java堆中分配的大堆栈段(例如,1Mb)。
只有在线程启动时才分配线程的堆栈段,并在线程终止时立即释放。同样的情况(我认为)也适用于线程的线程本地映射。没有“活动”的线程对象根本不需要太多内存。
所以总结一下。你似乎有很多活的线索。只要他们活着,他们就不会被垃圾收集,唯一能让他们释放记忆的方法就是让他们死去.不知何故。
要减少内存使用,您需要执行以下一项或多项操作:
run()方法等),找出它们为什么还在徘徊。https://stackoverflow.com/questions/1479214
复制相似问题