监视Java应用程序的内存使用情况

我想在一个Java进程中运行几个REST Web应用程序,以便在Akka的帮助下轻松保存内存和扩展。 我想估计每个请求处理程序消耗多少内存并检测整个系统的危险。

  1. 是否有可能在该进程内几乎实时监视内存使用情况,并找出每个请求处理程序使用了多少内存? 我需要实现的目标是什么? 有没有工具?

  2. 是否有可能捕获out of memory exception并基于内存使用情况做一些事情,例如仅崩溃请求处理程序超出假定的内存限制? 如果是这样,那会有什么不好的?

要回答您的第一个问题,您可以使用许多工具来监视内存使用情况,但是我不知道在“实际”时间内将内存使用情况映射到线程的任何应用程序。 在应用程序中,您可以使用MemoryMXBean和MemoryPoolMXBeans来监视内存使用情况,

回答你的第二个问题:不,不是真的。 除了捕获OOME通常是一个坏主意之外,主要问题是接收exception的线程可能不是真正的罪魁祸首。 OOME被抛出进行最终分配请求的线程。 但是, 其他一些线程可能是填满大部分内存的线程。 另一个问题是,由于OOME可能随时被抛出,因此可能会将其抛入应用程序中的某些关键代码中,使其处于残缺状态。 长话短说,当你收到OOME时,你几乎总是希望重新启动你的应用程序。

程序的总使用/可用内存可以通过java.lang.Runtime.getRuntime()在程序中获得;

运行时有几种与内存相关的方法。 以下编码示例演示了其用法。

 package test; import java.util.ArrayList; import java.util.List; public class PerformanceTest { private static final long MEGABYTE = 1024L * 1024L; public static long bytesToMegabytes(long bytes) { return bytes / MEGABYTE; } public static void main(String[] args) { // I assume you will know how to create a object Person yourself... List list = new ArrayList(); for (int i = 0; i <= 100000; i++) { list.add(new Person("Jim", "Knopf")); } // Get the Java runtime Runtime runtime = Runtime.getRuntime(); // Run the garbage collector runtime.gc(); // Calculate the used memory long memory = runtime.totalMemory() - runtime.freeMemory(); System.out.println("Used memory is bytes: " + memory); System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory)); } } 

VisualVM是一个监控应用程序的好工具。 你可以尝试一下: http : //visualvm.java.net/

您还可以添加代码语句来监视可用内存,如:

 Runtime runtime = Runtime.getRuntime(); System.out.println("Free memory: " + runtime.freeMemory() + " bytes."); 

无法处理此exception。 问题是,如果您在公共应用服务器(例如tomcat)中运行所有Web服务,那么如果存在“内存不足”exception,JVM将会关闭。 尝试查看程序中是否存在任何内存泄漏或内存处理错误。 您可以在Netbeans或Eclipse中使用分析。 此外,使用“findbugs”或“sonar”等工具进行代码分析可能会向您显示代码中可能存在的不良做法。

在任何情况下,使用有关垃圾收集或JVM内存的Java选项(如-Xmx)可以减少此类exception并提高性能。