【问题标题】:JVM memory consumption double of heapsizeJVM内存消耗是堆大小的两倍
【发布时间】:2011-04-25 03:17:57
【问题描述】:

我已将 64 位 Weblogic JVM 的最大堆大小设置为 4gb。当我对应用程序进行压力测试时,堆大小永远不会超过 4Gb,但 taskmanager 中的 java.exe 可以消耗高达 10 Gb。这种消费从何而来?

【问题讨论】:

  • 您在查看虚拟/分页内存使用情况吗?
  • 这不是Java堆的大小,不是JVM进程使用的系统堆吗?
  • 这是 weblogic 控制台中的堆大小

标签: java jvm heap-memory


【解决方案1】:

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

然后,下面是 JVM 进程中不计为 java 堆的东西的列表(从我的脑海中),其他人可能能够添加到列表中(或者可能减去或详细说明):

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2014-12-25
      • 2010-12-09
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多