如何解决在像 -Xms512G 这样的大情况下,JVM 是否会立即为堆获取整个 Xms 空间?
除了讨论巨大的堆大小 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
的大尺寸(只要你有很多物理内存),启动会慢很多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。