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

Raf*_*ota 14 java memory jvm

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

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

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

小智 11

程序的总使用/可用内存可以通过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<Person> list = new ArrayList<Person>();
    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));
  }
} 
Run Code Online (Sandbox Code Playgroud)


jta*_*orn 5

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

要回答第二个问题:不,不是真的。除了捕获OOME通常不是一个好主意外,主要的问题是接收到异常的线程可能不是真正的罪魁祸首。OOME抛出在发出最终分配请求的线程上。但是,其他一些线程可能是占满了大部分内存的线程。另一个问题是,由于可以随时抛出OOME,因此它可能会抛出到应用程序中的一些关键代码中,从而使其处于残缺状态。长话短说,收到OOME时,您几乎总是想重新启动应用程序。