java - 如何在java中查找非堆空间内存泄漏?

标签 java memory docker memory-leaks

我们有一个使用 eclipse-jetty 版本 8.1.6 的 java 网络服务器。最近我们开始注意到内存不足错误。 我们几乎没有对 Activity 线程数进行分析。这在 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

网络服务器平均每分钟接收 350 个请求。我们还在 ELB(kubernetes 服务)后面运行许多这样的实例。运行几个小时后,我们注意到这个 OOM。该问题是随机的,压力测试时出现。

OOM 堆栈跟踪:

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 容器上找到堆外内存大小。 有办法找到它吗?

经过一段时间的搜索,我在jetty下面发现了这个bug。

如何在不升级 jetty 的情况下验证错误是否是由于以下问题引起的?

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

最佳答案

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

关于java - 如何在java中查找非堆空间内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651420/

相关文章:

c# - 内存映射文件 : How much memory can be allocated for files

spring-boot - 带有私有(private)仓库的 Spring Boot Gradle bootBuildImage 任务

tomcat - 在 Ubuntu docker 中启动 tomcat8 失败

java - 在这种情况下可以从构造函数中抛出异常吗?

java - 在 MMapDirectory 中找不到段* 文件

node.js - mongoose在查询时降低内存使用的方法

docker - 我在哪里可以找到这个 golang 图像的 windows 版本的名称?

java - 为java程序设置时区标准

java - 获取没有 toString() 的枚举字符串

c - malloc() 和堆内存