情况-在tomcat上运行的API应用程序。每当我到达API端点时,“顶部”中的内存使用量就会增加一小部分。经过约35-40%(大约十二个请求)后,负载级别将从1%变为40 +%,应用程序变得无响应(并且必须重新启动tomcat /容器)。
我所做的:1.在1个请求之后进行5-10个请求,然后对堆进行转储并进行比较。内存增长不是在我的任何课程中,而是在'int []'和'java.lang'中。我对Java内存mgmt不够了解,无法了解这种情况。
我使用ps -eLf
监视了线程数/增长。什么都没报告。
使用jstat -gc
监视GC。输出看起来像这样:
(开始)
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
56832.0 57856.0 0.0 17266.5 157184.0 31716.8 546304.0 35573.4 40104.0 39112.5 4776.0 4474.5 7 1.669 2 0.251 1.921
(结束-在失去联系之前)
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
28160.0 27648.0 0.0 0.0 217088.0 4693.9 546304.0 76262.8 404008.0 402586.8 139816.0 139470.6 40 2.595 13 2.859 5.455
再次-我对Java内存mgmt的了解不足,无法真正解释这些值。我可以看到大型垃圾回收并不需要花费太多时间,但是肯定是在发生。 -XX:+UseG1GC
。没有真正的区别。
top -H
。关于其他地方的建议?在这里看到我忽略了的明显东西吗?
使用Java 8运行。最新的Tomcat版本。 CentOS 7.(测试在Docker中运行)。
情况-在tomcat上运行的API应用程序。每当我到达API端点时,“顶部”中的内存使用量就会增加一小部分。在通过大约35-40%(大约十二个请求)之后,负载级别变为...
jvisualvm
并进行远程连接(通过使用正确的jmx参数https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx_connections.html启动您的tomcat实例)。然后,您将能够看到一切,包括堆内存,还有更多。在您的情况下,您可能会用完堆内存,并且GC会继续尝试释放内存,但是由于内存泄漏而无法这样做,并且无限期地重复此操作,CPU非常繁忙。