Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存消耗是一个良好的Web应用程序健康检查指标吗?_Java_Servlets_Garbage Collection_Metrics_Health Monitoring - Fatal编程技术网

Java内存消耗是一个良好的Web应用程序健康检查指标吗?

Java内存消耗是一个良好的Web应用程序健康检查指标吗?,java,servlets,garbage-collection,metrics,health-monitoring,Java,Servlets,Garbage Collection,Metrics,Health Monitoring,我已经在jetty 8服务器上使用实现了一个healthcheck servlet。除了从我们的负载平衡器轮询之外,这些度量还定期(5分钟)写入日志文件。此外,当某些指标(如CPU负载或内存消耗)达到临界极限时,会发送电子邮件通知 这非常适合CPU负载和系统内存消耗。但是,定义用于测量JVM内存消耗的指标之一经常超过定义的阈值95%,尽管服务器运行稳定。因此,我们可能不得不重新考虑我们关于这个特定指标的决定。这是健康检查中使用的一个好指标吗?在垃圾收集器运行之前,我们的web应用程序经常达到阈值

我已经在jetty 8服务器上使用实现了一个healthcheck servlet。除了从我们的负载平衡器轮询之外,这些度量还定期(5分钟)写入日志文件。此外,当某些指标(如CPU负载或内存消耗)达到临界极限时,会发送电子邮件通知

这非常适合CPU负载和系统内存消耗。但是,定义用于测量JVM内存消耗的指标之一经常超过定义的阈值95%,尽管服务器运行稳定。因此,我们可能不得不重新考虑我们关于这个特定指标的决定。这是健康检查中使用的一个好指标吗?在垃圾收集器运行之前,我们的web应用程序经常达到阈值,这是内存泄漏的迹象,还是每个长时间运行的web应用程序都会出现这种正常行为

谢谢你的意见

这是我们的代码,它推动JVM内存健康检查

Java运行时内存

    private final Runtime runtime = Runtime.getRuntime();

    Result check() throws Exception {

        final long freeMem = this.runtime.freeMemory();
        // maxMemory() is the value set by the JVM -Xmx (Max HeapSize) parameter
        final long maxMem = this.runtime.maxMemory();
        final long usedMem = maxMem - freeMem;          

        final double value = RatioGauge.Ratio.of(usedMem, maxMem).getValue();
        final double threshold = 0.95;

        if (value < threshold) {
            // Everything OK: Memory usage usage is below the threshold.
        } else {
            // NOT OK: Memory usage is above the threshold.
        }
    }
private final Runtime=Runtime.getRuntime();
Result check()引发异常{
final long freeMem=this.runtime.freemory();
//maxMemory()是由JVM-Xmx(Max HeapSize)参数设置的值
final long maxMem=this.runtime.maxMemory();
最终长期使用的dmem=maxMem-freeMem;
最后一个双精度值=RatioGauge.Ratio.of(usedMem,maxMem).getValue();
最终双阈值=0.95;
如果(值<阈值){
//一切正常:内存使用率低于阈值。
}否则{
//不正常:内存使用率高于阈值。
}
}

您需要建立基线。只要你的应用程序在所需的负载(每秒请求数、在线用户数等)下工作正常,任何cpu/内存消耗或多或少都可以。一旦您有了基线,您就可以向代码中添加特性,然后检查特性是否会使消耗量减少或增加,并相应地采取行动。然后,如果需要,您将优化添加功能后恶化的代码中的位置(或者您发现没有本地代码更改可以节省您的时间,并且您需要更多硬件来支持给定负载下的新功能,或者您需要重新设计应用程序的某些组件,但这是另一回事)


因此,最重要的不是绝对值(尽管JVM堆消耗一直保持在95%有点令人担忧),而是代码更改之间的更改。

我们使用Java探查器(集成在Netbeans或Eclipse中)在开发期间执行您建议的前/后内存检查。目前的问题略有不同,因为我们需要在生产时检查健康状况。在过去的一周中,我们运行了几个测试,试图为JVM内存消耗建立一个阈值/基线。将阈值增加到99%仍然会不时触发警告-就在GC运行之前。为了避免偶尔出现峰值的问题,我们计算了过去5分钟的滑动平均值。尽管如此,使用这个指标似乎并不十分正确。您是否只需要增加JVM堆(-Xmx)?到目前为止,没有任何积极的迹象表明您存在内存泄漏,只是您的应用程序消耗了几乎所有可用的堆…也许-我将对其进行测试并报告。我们已经增加了JVM堆大小,服务器已经稳定运行了一周多。感谢您帮助解决此问题!修正在已接受答案的注释中。