【问题标题】:Does 64-bit java 1.7 ignore the minimum heap size flag?64 位 java 1.7 是否忽略最小堆大小标志?
【发布时间】:2012-03-15 23:00:47
【问题描述】:

java -Xms 显然不会影响 java 进程在运行期间消耗的内存量。

从系统的角度来看,我有一个消耗大约 1Gb 的应用程序。我尝试设置 -Xms2048m(和 -Xmx4096m),我发现内存消耗绝对没有变化。

热点文档声称堆大小受 Xms 值或默认值的限制。

我唯一能想到的可能是该进程无法获取连续的内存块,因此它获取了所有可能的内容,然后稍后会分配更多,或者可能是 Windows 不允许它开始拥有那么多内存。 (64 位 Windows 7)

(我什么都不需要这个,只是我注意到了一些奇怪的东西)

【问题讨论】:

  • 您是否将 -Mmx 设置为适当的值(即 mx > ms)?
  • @sw1nn - 是的,我将 mx 设置为 4096m。如果 ms > mx,我认为 vm 不会启动。
  • 你如何测量 Java 进程的内存使用情况?
  • windows 正在向您显示其中包含数据的实际消耗内存,而不是分配的地址空间
  • 你试过-Xincgc作为标志吗?

标签: java memory-management 64-bit


【解决方案1】:

默认的内存使用 Windows 任务管理器显示您不是在进程虚拟内存空间中分配的内容。这是该进程实际写入必须映射到真实内存的虚拟空间的量。如果您在任务管理器中启用“提交大小”列,它将从进程的虚拟地址空间的角度显示实际认为“已使用”的内容。 (大约 Xms + permsize + VM 和系统本身的大小。)

【讨论】:

    【解决方案2】:

    对于 Java 1,请尝试使用 -ms-mx

    从 Java2 开始,您可以使用 -Xms-Xmx

    我的经验是,-ms 和 `-mx 也适用于 Java2。见http://www.devx.com/tips/Tip/5578

    【讨论】:

      【解决方案3】:

      JVM 需要一个连续的内存区域用于堆。这意味着它在启动时将最大大小分配为虚拟内存。这并不像听起来那么糟糕,因为操作系统只在应用程序使用它时将主内存分配给应用程序,(而不是在它分配虚拟内存时)

      如果您查看 VisualVM 等工具中使用的内存量,您会发现即使开销为 150 - 500 MB,其大小仍小于最小大小。这是因为 Java 不只是使用最小大小,如果它没有用处。

      相反,最小大小是它只进行少量尝试清理内存的点。 (您可能会看到它执行次要 GC)在大多数情况下,这意味着应用程序将很快使用最小大小。但是,“hello world”程序不会使用最小大小。

      也许 windows 并没有让它有那么多内存开始

      如果无法将最大大小分配为连续块,JVM 将无法启动。 (这是 32 位 Window 的常见问题,限制可能为 1.5 GB 或低至 1.2 GB)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2012-04-30
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 2011-11-23
        相关资源
        最近更新 更多