JVM内存消耗是堆的两倍

时间:2010-10-13 23:20:02

标签: java jvm heap

我已将64位Weblogic JVM的最大堆大小设置为4gb。当我压力测试应用程序时,堆大小永远不会超过4Gb,但任务管理器中的java.exe最多可以消耗10 Gb。这种消费来自哪里?

2 个答案:

答案 0 :(得分:0)

嗯,这可能有很多原因,其中没有一个是特别令人兴奋的。首先,如前所述,在“任务管理器”中,查看进程的详细信息,并确保查看工作集而不是内存提交大小(虚拟内存)。

然后,下面是JVM进程中的一些列表(从头顶开始),它不会被视为java堆,其他人可能能够添加到列表中(或者可能减去或详细说明):< / p>

  • Perm gen
  • 线程堆栈空间
  • 共享代码段
  • 处理私人代码段
  • 进程I / O缓冲区
  • JVM“数据/代码”(热点内容,各种临时,缓存等)
  • 上述数据中的内存碎片

但我同意你的意见,如果你真的在看工作装置,那听起来有点惊人。我们通常在高负载(Debian Linux)的32位树脂服务器上使用1-1.5 GB的非Java堆内存。

答案 1 :(得分: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));
  }
}