代码之家  ›  专栏  ›  技术社区  ›  Dan

JVM内存消耗是heapsize的两倍

  •  0
  • Dan  · 技术社区  · 16 年前

    我已经将64位Weblogic JVM的最大堆大小设置为4gb。当我强调测试应用程序时,堆大小永远不会超过4Gb,而是java。taskmanager中的exe可消耗高达10 Gb的空间。这种消费来自哪里?

    2 回复  |  直到 4 年前
        1
  •  0
  •   vegolasse    15 年前

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

    然后,下面是JVM进程中不算作java堆的东西的列表(从我的头顶上看),其他人可能可以添加到列表中(或者减去或详细说明):

    • 永久发电机
    • 线程堆栈空间
    • 共享代码段
    • 处理专用代码段
    • 进程内输入/输出缓冲区
    • JVM“数据/代码”(热点内容、各种临时文件、缓存等)
    • 上述数据中的内存碎片

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

        2
  •  0
  •   catch32    13 年前

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