如何在Java中find非堆空间内存泄漏?

我们有一个使用eclipse-jetty版本8.1.6的java webserver。 最近我们开始注意到内存不足的错误。 我们对活动的线程数目没有分析。 这在100左右似乎是合理的。该进程有5GB的最大堆内存和4GB的初始堆内存。

Process Details Environment: Docker(kubernetes) java.version="1.8.0_91" java.vm.info="mixed mode" java.vm.name="Java HotSpot(TM) 64-Bit Server VM" thread size = 1024K ulimit is unlimited for max process per user. Container(Pod) Max memory is allocated to be 8GB 

networking服务器平均每分钟接收350个请求。 我们还在ELB(kubernetes服务)之后运行了许多这样的实例。 运行几个小时后,我们注意到这个OOM。 这个问题是随机的,它发生在压力testing。

OOM StackTrace:

 java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) [na:1.8.0_91] at java.lang.Thread.start(Thread.java:714) [na:1.8.0_91] at org.eclipse.jetty.util.thread.QueuedThreadPool.startThread(QueuedThreadPool.java:441) [jetty-util-8.1.16.v20140903.jar:8.1.16.v20140903] at org.eclipse.jetty.util.thread.QueuedThreadPool.dispatch(QueuedThreadPool.java:366) [jetty-util-8.1.16.v20140903.jar:8.1.16.v20140903] 

由于线程数是合理的。 我怀疑有一些内存泄漏。 但是我无法在Docker容器上find堆内存大小。 有没有办法find它?

在search了一段时间后,我在docker发现了这个错误。

如何validation,如果错误是由于以下问题,而不升级docker?

相关的错误ID: https : //bugs.eclipse.org/bugs/show_bug.cgi? id = 478717

您可以尝试将-XX:-HeapDumpOnOutOfMemoryError添加到您的java启动参数中并查看转储。