正在调试有可能内存泄漏的tomcat应用程序

问题描述 投票:0回答:1

情况-在tomcat上运行的API应用程序。每当我到达API端点时,“顶部”中的内存使用量就会增加一小部分。经过约35-40%(大约十二个请求)后,负载级别将从1%变为40 +%,应用程序变得无响应(并且必须重新启动tomcat /容器)。

我所做的:1.在1个请求之后进行5-10个请求,然后对堆进行转储并进行比较。内存增长不是在我的任何课程中,而是在'int []'和'java.lang'中。我对Java内存mgmt不够了解,无法了解这种情况。

  1. 我使用ps -eLf监视了线程数/增长。什么都没报告。

  2. 使用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的了解不足,无法真正解释这些值。我可以看到大型垃圾回收并不需要花费太多时间,但是肯定是在发生。

    1. 也曾尝试(作为冰雹)使用-XX:+UseG1GC。没有真正的区别。

  • 随着使用率值的升高,我已经观看了CPU%/ IOWait(通过顶部)。 CPU保持理性,没有可测量的IOWait。还用wchan看着top -H
  • 关于其他地方的建议?在这里看到我忽略了的明显东西吗?

使用Java 8运行。最新的Tomcat版本。 CentOS 7.(测试在Docker中运行)。

情况-在tomcat上运行的API应用程序。每当我到达API端点时,“顶部”中的内存使用量就会增加一小部分。在通过大约35-40%(大约十二个请求)之后,负载级别变为...

java tomcat
1个回答
0
投票
使用jvisualvm并进行远程连接(通过使用正确的jmx参数https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/jmx_connections.html启动您的tomcat实例)。然后,您将能够看到一切,包括堆内存,还有更多。在您的情况下,您可能会用完堆内存,并且GC会继续尝试释放内存,但是由于内存泄漏而无法这样做,并且无限期地重复此操作,CPU非常繁忙。
© www.soinside.com 2019 - 2024. All rights reserved.