【问题标题】:Will process be allocated enough heap when no explicit parameters are specified?当没有指定显式参数时,是否会为进程分配足够的堆?
【发布时间】:2017-01-28 12:48:46
【问题描述】:

我正在通过 java 8 上的主类运行 java 进程。我没有在任何地方指定 min(Xms) 和 max(Xmx) 堆大小。但是当我通过visualVM检查时 4267704320(即 4.26 GB),这是给定进程的默认最大堆大小(通过 windows 命令确认也是 -XX:+PrintFlagsFinal -version 2>&1 | findstr MaxHeapSize。同样在 linux box 上)。

我的问题是如果我的进程(在 linux 机器上)需要更多 5 GB(我有 30 GB RAM),当我没有指定时,我的进程是否会被分配 5 GB 内存 任何显式堆大小(Xms 和 Xmx)参数。

【问题讨论】:

    标签: java performance memory-management jvm


    【解决方案1】:

    鉴于您机器上的可用 RAM,如果您在服务器模式下运行 64 位 JVM,那么是的,堆大小将能够增加到大约 7.5 GB。

    Documentation(我高亮了相关部分):

    客户端 JVM 默认初始和最大堆大小

    默认的最大堆大小是物理内存的一半,最大为 192 兆字节 (MB),否则 物理内存的四分之一 最大1 GB 的物理内存大小。

    服务器 JVM 默认初始和最大堆大小

    默认初始和最大堆大小在服务器 JVM 上的工作方式与在客户端 JVM 上的工作方式相似,只是默认值可以更高。在 32 位 JVM 上,如果有 4 GB 或更多的物理内存,默认的最大堆大小可以达到 1 GB。 在 64 位 JVM 上,如果有 128 GB 或更多的物理内存,默认的最大堆大小可达 32 GB。您始终可以通过直接指定这些值来设置更高或更低的初始堆和最大堆;请参阅下一节。

    同样,假设 64 位 JVM 在服务器模式下运行,根据文档,默认的最大堆大小将是总 RAM 的四分之一。因此,在您的情况下大约为 7.5 GB(30 GB 的 1/4)。

    如果在服务器模式下运行 32 位 JVM,则上限为 1 GB。在客户端模式下,您的最大值为 256 MB。

    【讨论】:

    • 对于 64 位 JVM,只有服务器模式。而且由于 OP 已经声明 JVM 使用 4GB 最大内存,它必须是 64 位 JVM。顺便说一句,在实践中,32 位 JVM 设法使用超过 1 GB。
    • @Holger:谢谢。我不清楚 OP 提到的最大 4GB 是仅在 Windows 中还是在 Linux 中。
    • @sstan 两个后续问题 1)如果 3GB 已经被另一个进程占用了怎么办。然后我相信分配给第二个进程的默认内存将是 7.5-3=4.5 GB。正确的 ? 2) 假设我在没有任何显式堆大小选项的情况下启动第一个 java 进程。因此,根据您的回答,默认分配的最大堆将是 7.5。现在如果要运行另一个需要 2 GB 堆的 java 进程。我可以开始第二个过程吗?我相信答案不应该,因为已经为第一个进程保留了 7.5 GB 内存。对吗?
    • @sstan 你能回复我最后的评论吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2017-05-24
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    相关资源
    最近更新 更多