【问题标题】:What is the default maximum heap size for Sun's JVM from Java SE 6?Java SE 6 中 Sun 的 JVM 的默认最大堆大小是多少?
【发布时间】:2011-02-24 07:25:15
【问题描述】:

从 Java SE 6 开始,Sun 的 JVM 的默认最大堆大小是多少(即相当于设置 -Xmx)?

看起来像是带有服务器级机器的 Java SE 5,it's

小于物理内存的 1/4 或 1GB。

额外问题:对于 IBM 的 JVM,您可以ask it

java -verbose:sizes -version

你能同样问一下 Sun 的 JVM 吗?

编辑

我使用 Runtime.getRuntime().maxMemory 来确认 min(physical memory/4, 1G),在Sun documentation 中引用。

【问题讨论】:

    标签: java jvm memory-management


    【解决方案1】:

    java 1.6.0_21 或更高版本,左右...

    $ java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize
    uintx MaxHeapSize                         := 12660904960      {product}
    

    看来 min(1G) 已被删除。

    或者在 Windows 上使用 findstr

    C:\>java -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize
    

    【讨论】:

    • 好东西,同样的方法也可以找到MaxPermSize
    • 为了进一步阐明这一点,Windows 上的上述命令给出了以字节为单位的大小。所以你需要将它除以 1024*1024 以获得 MB。至少以上对于我的 Windows 机器来说是正确的,我的大小为 256MB(将结果除以 1024*1024 后)
    • "看起来 min(1G) 已被删除。"这不是 InitialHeapSize 值吗?
    【解决方案2】:

    可以用一些 Java 代码询问:

    long maxBytes = Runtime.getRuntime().maxMemory();
    System.out.println("Max memory: " + maxBytes / 1024 / 1024 + "M");
    

    javadoc

    【讨论】:

      【解决方案3】:

      使用 JDK, 您还可以使用 jinfo 连接到有问题的 <PROCESS_ID> 的 JVM 并获取 MaxHeapSize 的值:

      jinfo -flag MaxHeapSize <PROCESS_ID>
      

      【讨论】:

        【解决方案4】:

        从 JDK6U18 开始,以下是堆大小的配置。

        在客户端 JVM 中,默认的 Java 堆配置已经 修改以提高当今富客户端的性能 应用程序。初始和最大堆大小更大,设置 与分代垃圾收集相关的更好调整。

        默认的最大堆大小是物理内存的一半,最大物理内存大小为 192 兆字节,否则为四分之一 物理内存最大为 1 GB 的物理内存大小。 例如,如果您的机器有 128 兆的物理内存,那么最大堆大小为 64 兆,并且大于或等于 到 1 GB 的物理内存导致最大堆大小为 256 兆字节。 JVM 不会实际使用最大堆大小,除非您的程序创建了足够的对象来需要它。数量少得多, 称为初始堆大小,在 JVM 初始化期间分配。 此数量至少为 8 兆字节,否则为物理量的 1/64 内存最大为 1 GB 的物理内存大小。

        来源:http://www.oracle.com/technetwork/java/javase/6u18-142093.html

        【讨论】:

          【解决方案5】:

          一种方法是,如果您安装了 jdk,在 bin 文件夹中有一个名为 jconsole 的实用程序(甚至可以使用 visualvm)。 启动它并连接到相关的 java 进程,您可以看到设置的堆大小设置和许多其他详细信息

          当只运行无头或 cli 时,如果您在启动相关服务时指定要连接的端口,则可以通过 lan 使用 jConsole。

          【讨论】:

          • 它是无头的,所以没有图形功能。
          【解决方案6】:

          要回答这个问题,Java VM 是处于 CLIENT 模式还是 SERVER 模式至关重要。 您可以指定“-client”或“-server”选项。否则java使用内部规则;基本上 win32 始终是客户端,Linux 始终是服务器,但请参见此处的表格:

          http://docs.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html

          Sun/Oracle jre6u18 文档说重新客户端:如果机器

          Sun/Oracle jre6u18 文档说重新服务器:与客户端相同,然后添加了令人困惑的语言:对于 32 位 JVM,默认最大值为 1Gb,而对于 64 位 JVM,默认最大值为 32Gb。在我对物理 8Gb 的 64 位 linux 机器上的测试中,Java 分配了 2Gb,是物理的 1/4;在具有 128Gb 物理 Java 的 64 位 Linux 机器上分配 32Gb,同样是物理的 1/4。

          感谢这篇 SO 帖子对我的指导:

          Definition of server-class machine changed recently?

          【讨论】:

          • 什么是客户端和服务器模式?我对这两种模式感到困惑,它们实际上是什么?
          猜你喜欢
          • 2012-09-19
          • 2015-04-01
          • 2013-08-25
          • 2015-02-17
          • 1970-01-01
          • 2010-12-07
          • 2014-01-11
          • 1970-01-01
          相关资源
          最近更新 更多