微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在像 -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.javatime java -Xmx50 DeleteMe.java 显示几乎相同的时间。 保留 5120 GB50MB 的虚拟内存在时间上没有区别。

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

time java -Xms5120g DeleteMe.java

显示大约 9 和 10 秒,同时:

time java -Xms50m DeleteMe.java

仅显示大约一秒钟。

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


使用 -Xms512g-Xms512m 测试您的确切场景,仍然显示至少 1 second 的时间延迟。正如评论中所指出的,值得一提的是 -XX:+AlwaysPreTouch 标志。它将预先接触所有提交内存,直到-Xms,这显然意味着使用这样的标志和-Xms的大尺寸(只要你有很多物理内存),启动会慢很多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。