JVM内存消耗是堆大小的两倍

64jmpszr  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(156)

我已经将64位Weblogic JVM的最大堆大小设置为4GB。当我对应用进行压力测试时,堆大小从未超过4GB,但任务管理器中的java.exe可能会消耗高达10GB的内存。这种消耗来自哪里?

kse8i1jr

kse8i1jr1#

首先,如前所述,在“任务管理器”中,查看进程的详细信息,并确保您查看的是工作集,而不是内存提交大小(虚拟内存)。
然后,下面是一个列表(从我的头)的东西,在JVM进程中,不会算作java堆,其他人可能能够添加到列表(或可能减去或详细说明):

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

但是我同意你的观点,如果你真的在看工作集,这听起来有点大。在高负载下,我们通常在32位resin服务器上使用1-1.5 GB的非java堆内存(Debian Linux)。

h9vpoimq

h9vpoimq2#

一个程序的总的已用/空闲内存可以在程序中通过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));
  }
}

相关问题