2

我已经使用Metrics在我们的 jetty 8 服务器上实现了一个健康检查 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.
        }
    }
4

1 回答 1

0

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

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

于 2013-06-12T10:57:32.767 回答