如何以适当的方式监视JVM内存?


9

我正在考虑如何在生产环境中以繁忙的时间以低开销的方式进行JVM内存监视。

假设我有两个生产中的tomcat应用服务器,并在它们后面设置了负载平衡。如果可以看到jvm内存统计信息,则可以告诉负载平衡停止将请求发送到服务器,这将遇到OOM问题。这有意义吗?Jconsole或VisualVM占用更多性能资源不是我的选择。


Java的西蒙框架可能是一个值得看。
khmarbaise 2012年

Answers:



1

其他人提供了有关如何监视内存使用情况的建议...

假设我有两个生产中的tomcat应用服务器,并在它们后面设置了负载平衡。如果可以看到jvm内存统计信息,则可以告诉负载平衡停止将请求发送到将遇到OOM问题的服务器。这有意义吗?

有点。但这不一定是解决问题的最佳方法。

让我们回溯到问题的根源... OOME。在Tomcat的上下文中,OOME可能是由以下原因之一引起的:

  • 应用程序(或可能是Tomcat本身)中的内存泄漏,
  • 尝试在每个Tomcat上并行处理太多请求,或者
  • 在处理期间需要太多内存的单个请求。

要解决您的问题,您首先需要找出正在发生的问题...因为每种解决方案都不相同。

1)要查看这是否是内存泄漏,您需要使用内存分析工具来检查长期内存使用模式。这可能会显示锯齿状……这是正常的。您需要寻找的是“牙齿”的底部水平随时间上升的趋势。这表明某种东西正在造成无法收集的垃圾;即内存泄漏。

如果您有内存泄漏,那么最好的解决方案是弄清楚代码的哪一部分负责并进行修复。其他任何事情(包括负载平衡)都是临时解决方案,可能会导致更严重的问题。

2)消除了内存泄漏之后,您需要确定问题是否在于您一次处理了太多请求。我不确定做到这一点的最佳方法,但是如果这是问题所在(或您怀疑是问题所在),那么有几种可能的解决方案:

3)如果问题出在某些请求使用了过多的内存,那么您需要先弄清楚如何检测这些请求并“处理”。检测和处理这些请求都可能很困难……而且如果没有您的申请的详细信息,也很难提出建议。但是,有一些实用的解决方案:

  • 将异常请求转发到具有大堆的另一台服务器上……OOME在该服务器上不会干扰“正常”请求。

  • 增加堆大小。如果您有足够的物理内存,则使用更大的堆运行实际上可以使Tomcat服务器更高效……并避免使用OOME。


总而言之,建议您找出负载平衡以避免OOME的原因,而不是尝试避免OOME,而是尝试直接解决OOME的原因。


0

也许jvmtop值得您关注。

它以基于jvm的“类似顶部”的方式向您显示监视指标,例如内存消耗,cpu利用率,线程数等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.