Java 堆设置

标签 java jvm jvm-arguments

在阅读一些关于性能调优的笔记时,我在设置内存大小时确实注意到了一条建议:

Java 应用程序应将初始和最大永久代大小设置为相同的值,因为增加或收缩永久代空间需要完整的 GC。设置堆大小时给出了类似的建议,即-Xmx=-Xms

我的问题是,那我们为什么要有 -Xms 设置呢?

此外, 为什么如果 -Xmx 和 -Xms 的值不同,而不是当我的 -Xmx 和 -Xms 的大小相同时,GC 会经常被触发。

要为我的第二个问题添加更多内容,如果我从最小堆大小 64M 和最大 512M 开始,我相信除非我的应用程序使用的内存达到 512M,否则不会触发完整 GC。

同样,如果我为 -Xmx 和 -Xms 从 512M 开始,当我的应用程序内存使用达到此限制时,JVM 仍然会触发完整的 GC。 那么为什么建议将 max 和 min 设置为相同的值呢?

最佳答案

设置标志是在 VM 具有分代增量收集之前设计的。在那种情况下,完整的 Collection 就在那里。在更现代的 Collection 家中,完整的 Collection 品很少见。这很好,因为增量收集通常只需几毫秒,因此 UI 体验不会改变。大型竞技场的完整 Collection 可能需要几秒钟或更长时间。更改竞技场大小 - 如文档所述 - 保证每次都会导致完整收集。

指导并非 100% 完美。允许竞技场增长是合理的,只有少数几种应用。

关于Java 堆设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170100/

相关文章:

java - 如何在 JCR SQL2 查询中转义动态生成的字符串值?

java - Java程序运行时JVM遵循什么顺序?

java - 如何在 Ubuntu 中为 JNI C/C++ 库查找 JDK 目录

java - 无法从 Eclipse 将默认 Java libGDX 项目导出为 jar

Java ObjectInputStream(服务器\客户端)

java - Oracle JDK8:展开循环由JVM转换为NOOP吗?

java - 无法在 Solaris 上初始化类 sun.awt.X11GraphicsEnvironment

java - 如何在Solaris 10 64位上运行64位jdk

java - 将 JVM 参数添加到 Spring Boot 应用程序

java - Project$$EnhancerByCGLIB$$67a694bd 出现在 Hibernate 中