我有一个在Tomcat7实例上运行的Java应用程序。我使用的是Java 8。
现在我的应用程序中有一个格式为http://zzz.xxx.zzz.xxx/someWebservice?somepar1=rrr&somePar2=yyy的Web服务。这将返回最多10个字符的String
值。
我现在开始使用Jmeter对此服务进行负载测试。我正在加载100个并发连接并获得大约150 requests/second
的吞吐量。该服务器是一个4核-6GB的机器,只运行Tomcat(应用程序实例)。数据库实例在单独的计算机上运行。 JVM运行时最小2GB和最大4 GB内存分配。最大烫发大小为512 MB。 Tomcat有足够的线程来满足我的负载(最大连接/线程/执行器值已正确设置)
我现在正在尝试优化此服务,为了做到这一点,我试图分析内存消耗。我正在使用JConsole
。我的CPU使用率不是问题,但是当我查看内存(HEAP)的使用情况时,我觉得有些不对劲。我观察到的是一个锯齿形状的图形,我知道它是正确的,因为常规GC清除了堆内存。
我担心的是这个锯齿形图有一个上升趋势。我的意思是锯齿的波谷似乎随着时间的推移而增加。随着这种趋势,我的服务器最终在一小时左右达到最大堆内存,然后稳定在4GB。我相信如果我放置CONSTANT负载,那么堆内存利用率应该有一个恒定的趋势,即锯齿图的峰值和波谷对齐。如果存在上升趋势,我怀疑存在随时间收集的变量的内存泄漏,并且由于GC无法清除它们,因此在一段时间内会有增加。我附上了截图。
问题:
1)。这是正常的行为吗?如果是,那么为什么尽管负载没有变化,堆仍在不断增加?我不相信100个线程的负载应该在大约30分钟内饱和4GB堆。
2)。这可能是什么原因?我需要查看内存泄漏吗?除JConsole之外的任何JVM分析器可以帮助我找出GC无法清除的变量吗?
答案 0 :(得分:3)
跷跷板模式很可能源于次要收藏品,14:30左右的下降是一个主要的收藏品,你在做推理时没有考虑到这一点。
您的负载可能很低,需要很长时间才能达到稳定状态。
有了这个趋势,我的服务器最终会在一个小时左右达到最大堆内存,然后稳定在4GB。
如果您没有看到任何OOME,请支持该结论。
但是只有这么多人可以从这些图表中推断出来。如果您想了解更多信息,则应启用GC日志记录并检查日志输出。