我正在考虑如何在生产环境中以繁忙的时间以低开销的方式进行JVM内存监视。
假设我有两个生产中的tomcat应用服务器,并在它们后面设置了负载平衡。如果可以看到jvm内存统计信息,则可以告诉负载平衡停止将请求发送到服务器,这将遇到OOM问题。这有意义吗?Jconsole或VisualVM占用更多性能资源不是我的选择。
我正在考虑如何在生产环境中以繁忙的时间以低开销的方式进行JVM内存监视。
假设我有两个生产中的tomcat应用服务器,并在它们后面设置了负载平衡。如果可以看到jvm内存统计信息,则可以告诉负载平衡停止将请求发送到服务器,这将遇到OOM问题。这有意义吗?Jconsole或VisualVM占用更多性能资源不是我的选择。
Answers:
JMX就是答案(Jolokia是JMX接口)。
您可能还想看看-https: //stackoverflow.com/questions/242958/best-tools-to-monitor-tomcat
其他人提供了有关如何监视内存使用情况的建议...
假设我有两个生产中的tomcat应用服务器,并在它们后面设置了负载平衡。如果可以看到jvm内存统计信息,则可以告诉负载平衡停止将请求发送到将遇到OOM问题的服务器。这有意义吗?
有点。但这不一定是解决问题的最佳方法。
让我们回溯到问题的根源... OOME。在Tomcat的上下文中,OOME可能是由以下原因之一引起的:
要解决您的问题,您首先需要找出正在发生的问题...因为每种解决方案都不相同。
1)要查看这是否是内存泄漏,您需要使用内存分析工具来检查长期内存使用模式。这可能会显示锯齿状……这是正常的。您需要寻找的是“牙齿”的底部水平随时间上升的趋势。这表明某种东西正在造成无法收集的垃圾;即内存泄漏。
如果您有内存泄漏,那么最好的解决方案是弄清楚代码的哪一部分负责并进行修复。其他任何事情(包括负载平衡)都是临时解决方案,可能会导致更严重的问题。
2)消除了内存泄漏之后,您需要确定问题是否在于您一次处理了太多请求。我不确定做到这一点的最佳方法,但是如果这是问题所在(或您怀疑是问题所在),那么有几种可能的解决方案:
调整Tomcat服务器配置以减少辅助线程数。
如果您的请求受I / O约束,那么另一种可能性是查看Servlet规范的最新版本中提供的异步请求处理支持-请参阅http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm。但这将需要更多工作。
3)如果问题出在某些请求使用了过多的内存,那么您需要先弄清楚如何检测这些请求并“处理”。检测和处理这些请求都可能很困难……而且如果没有您的申请的详细信息,也很难提出建议。但是,有一些实用的解决方案:
将异常请求转发到具有大堆的另一台服务器上……OOME在该服务器上不会干扰“正常”请求。
增加堆大小。如果您有足够的物理内存,则使用更大的堆运行实际上可以使Tomcat服务器更高效……并避免使用OOME。
总而言之,建议您找出负载平衡以避免OOME的原因,而不是尝试避免OOME,而是尝试直接解决OOME的原因。
也许jvmtop值得您关注。
它以基于jvm的“类似顶部”的方式向您显示监视指标,例如内存消耗,cpu利用率,线程数等。