【发布时间】:2015-02-24 17:37:24
【问题描述】:
我们在 AWS 上的 Tomcat 中以大约 20 个实例的数组运行基于 Jersey (1.x) 的服务 一个实例周期性地“变坏”:在大约 4 小时的过程中,它的堆和 CPU 使用率会增加,直到堆已用尽,CPU 已固定。此时,它会自动从负载均衡器中删除并最终被杀死。
检查这些实例的堆转储,大约 95% 的内存已被 java.lang.ref.Finalizer 的一个实例用尽,该实例持有各种东西,但大部分或全部与 HTTPS 相关连接 sun.net.www.protocol.https.HttpsURLConnectionImpl、sun.security.ssl.SSLSocketImpl、各种加密对象)。这些是我们使用 Jersey 的客户端库与外部 Web 服务建立的连接。来自“健康”实例的堆转储并不表示存在任何问题。
在负载相对较低的情况下,实例可以运行数天或数周而不会出现问题。随着负载的增加,实例故障的频率也会增加(平均 CPU 达到约 40% 时,每天发生几次)。
我们的 JVM 参数是:
-XX:+UseG1GC -XX:MaxPermSize=256m -Xmx1024m -Xms1024m
我正在为垃圾收集指标添加 JMX 日志记录,但我并不完全清楚我应该寻找什么。在这一点上,我主要是在寻找可能引发此类失败的想法或其他调查目标。
【问题讨论】:
标签: java garbage-collection finalizer