如何在运行后找到Java堆的最大大小?

时间:2011-12-14 10:19:06

标签: java memory

我正在群集上运行一个大型Java应用程序,并且我有很多内存可用。因此,我打算用一个巨大的最大堆大小启动我的JVM,看看它是否有效。但是我需要多次运行这个,我想知道堆在运行期间实际上有多大。我知道我可以使用像VisualVM这样的工具来做这件事但是如果我不想运行一个基于ui的大应用程序呢?在我的应用程序终止后,是否有一些参数可以发送到jvm来获取这种内存统计信息?或者可能是一个基于命令行的应用程序,可以很容易地做到这一点?

5 个答案:

答案 0 :(得分:3)

jstat就是你所追求的。它将每秒打印统计数据(或您指定的任何内容),然后您可以分析输出以找到最大值。

答案 1 :(得分:2)

您可以在应用程序中执行此操作:

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();

然后在返回的getCommitted()对象上使用getUsed()getMax()MemoryUsage方法。

答案 2 :(得分:1)

您需要使用以下内容来分析您的应用程序:

http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html#LowMemoryDetection

答案 3 :(得分:1)

U可以使用下面的方法来获取堆大小的值

调用Runtime.getRuntime()totalMemory();

答案 4 :(得分:0)

程序的总使用/空闲内存可以通过java.lang.Runtime.getRuntime();

在程序中获得

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

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

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));
  }
}