在像 -Xms512G 这样的大情况下,JVM 会立即为堆获取整个 Xms space 吗?

Is JVM immediately grab whole the Xms space for heap in huge cases like -Xms512G?

除了关于巨大堆大小 GC 挑战的讨论之外,JVM 是否会立即抓取所有 -Xms512G 如果设置? ( 512G 只是象征着一个巨大的堆,如果有帮助,假设另一个巨大的价值)

开始好像很费时间吧?谁能从一开始就阐明 JVM 在这种情况下的行为?

-Xmx怎么样?

编辑:我只想知道:-Xms512G 参数化程序在启动时是否有任何延迟针对同一程序但 -Xms512m 参数化

编辑 XX:+AlwaysPreTouch 对此有何影响?

-Xmx-Xms有区别。 Xmx 保留虚拟内存(你有很多)。因此,例如一些这样的代码(Mac OSX 上的相同数字和 linux 的一些版本):

public class DeleteMe {

    public static void main(String[] args) {
       LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
       System.out.println("done");
    }

}

运行 与 time java -Xmx5120g DeleteMe.javatime java -Xmx50 DeleteMe.java 显示几乎相同的时间。 保留 5120 GB50MB 虚拟内存在时间上没有区别。

另一方面 -Xms 将此内存提交给进程,这更昂贵。所以运行宁:

time java -Xms5120g DeleteMe.java

显示大约 9 秒和 10 秒,而 :

time java -Xms50m DeleteMe.java

只显示大约一秒。

所以是的,这些电话有一些延迟。请求内存时是否可以超过物理 RAM,取决于 linuxvm.overcommit_memory 标志。不过,我不知道在 Windows 上是什么设置控制了这个。


-Xms512g-Xms512m 测试你的确切场景,仍然显示至少 1 second 时间延迟。如评论中所述,还值得一提 -XX:+AlwaysPreTouch 标志。它会预触摸所有 committed 内存,所以直到 -Xms,这显然意味着有了这样的标志和 -Xms 的大尺寸(只要你有那么多物理内存),启动会慢很多。