链表内存泄漏
LinkedList Memory Leak
我正在尝试调试挂起的应用程序。该程序使用 LinkedList
实现的队列,在压力测试期间,我发现该程序由于 运行 堆内存不足而停止响应。我分析了堆转储,发现内存似乎从 LinkedList
泄漏。
堆转储的相关部分:
▶java.net.Vectior @ 0xff5eacd0
▶▶java.util.Vector @ 0xff629f30
▶▶▶java.lang.Object[1280] @ 0xff629f50
▶▶▶▶class com.itnade.vsm.staticobject.TrapQueue @ 0xff6b23e8
▶▶▶▶▶java.util.LinkedList @ 0xff6b2460
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb954560
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb959968
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb95ede8
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb964230
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb969638
...
...
正如您从转储中看到的那样,LinkedList$Node
s 没有被删除,并且累积。
程序的大致流程是:
Queue.offer() → Queue.poll → Queue.remove(对象)
为什么 LinkedList
似乎在泄漏内存,我该如何防止这种情况发生?
根据How to handle memory Leaks while continuous insertion in a LinkedList?:
您的问题不会通过显式删除对象来解决...主要是因为在 Java.
中没有办法做到这一点
'如果您真的为 CMS 收集器创建了太多垃圾来处理,那么唯一的解决方案是使用对象池来回收缓冲区对象,而不是将它们丢弃在地板上以供 GC 处理.但是,您需要注意不要将您当前的问题替换为其他问题:
The recycled objects may need to be "cleaned" (zeroed).
A poorly designed object pool can be a memory leak.
A poorly designed object pool can be a concurrency bottleneck.
A poorly designed object pool can increase GC overheads, especially if you are running with a heap that is too small.
另一方面,您的真正问题可能是您的堆对于您尝试的应用程序来说太小 运行。如果你 运行 太接近限制,GC 将不会每次回收很多垃圾。由于 运行 GC 的成本与非垃圾的数量成正比,因此很容易看出,随着堆接近满,GC 的效率是非线性的。'
您可以通过以下代码在一个代码点调用垃圾收集器:
'system.GC();'
我正在尝试调试挂起的应用程序。该程序使用 LinkedList
实现的队列,在压力测试期间,我发现该程序由于 运行 堆内存不足而停止响应。我分析了堆转储,发现内存似乎从 LinkedList
泄漏。
堆转储的相关部分:
▶java.net.Vectior @ 0xff5eacd0
▶▶java.util.Vector @ 0xff629f30
▶▶▶java.lang.Object[1280] @ 0xff629f50
▶▶▶▶class com.itnade.vsm.staticobject.TrapQueue @ 0xff6b23e8
▶▶▶▶▶java.util.LinkedList @ 0xff6b2460
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb954560
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb959968
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb95ede8
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb964230
▶▶▶▶▶▶java.util.LinkedList$Node @ 0xfb969638
...
...
正如您从转储中看到的那样,LinkedList$Node
s 没有被删除,并且累积。
程序的大致流程是:
Queue.offer() → Queue.poll → Queue.remove(对象)
为什么 LinkedList
似乎在泄漏内存,我该如何防止这种情况发生?
根据How to handle memory Leaks while continuous insertion in a LinkedList?:
您的问题不会通过显式删除对象来解决...主要是因为在 Java.
中没有办法做到这一点'如果您真的为 CMS 收集器创建了太多垃圾来处理,那么唯一的解决方案是使用对象池来回收缓冲区对象,而不是将它们丢弃在地板上以供 GC 处理.但是,您需要注意不要将您当前的问题替换为其他问题:
The recycled objects may need to be "cleaned" (zeroed).
A poorly designed object pool can be a memory leak.
A poorly designed object pool can be a concurrency bottleneck.
A poorly designed object pool can increase GC overheads, especially if you are running with a heap that is too small.
另一方面,您的真正问题可能是您的堆对于您尝试的应用程序来说太小 运行。如果你 运行 太接近限制,GC 将不会每次回收很多垃圾。由于 运行 GC 的成本与非垃圾的数量成正比,因此很容易看出,随着堆接近满,GC 的效率是非线性的。'
您可以通过以下代码在一个代码点调用垃圾收集器: 'system.GC();'