问题描述
除了讨论巨大的堆大小 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");
}
}
run with time java -Xmx5120g DeleteMe.java
和 time java -Xmx50 DeleteMe.java
显示几乎相同的时间。 保留 5120 GB
和 50MB
的虚拟内存在时间上没有区别。
另一方面,-Xms
将此内存提交给进程,这更昂贵。所以运行:
time java -Xms5120g DeleteMe.java
显示大约 9 和 10 秒,同时:
time java -Xms50m DeleteMe.java
仅显示大约一秒钟。
所以是的,这些电话有一些延迟。请求内存时是否可以超过物理 RAM
,取决于 vm.overcommit_memory
的 linux
标志。不过,我不知道 Windows 上的设置是什么。
使用 -Xms512g
和 -Xms512m
测试您的确切场景,仍然显示至少 1 second
的时间延迟。正如评论中所指出的,值得一提的是 -XX:+AlwaysPreTouch
标志。它将预先接触所有提交内存,直到-Xms
,这显然意味着使用这样的标志和-Xms
的大尺寸(只要你有很多物理内存),启动会慢很多。