java - 如何确保 JVM 以 Xms 的值启动

标签 java garbage-collection jvm heap-memory

当我运行起始堆大小为 3G(由 -Xms3072m VM 参数设置)的 java 程序时,JVM 不会以该大小开始。它从 400m 左右开始,然后根据需要不断获取更多内存。

这对我来说是个严重的问题。我知道一段时间后 JVM 将需要上述数量。当 JVM 根据需要增加其内存时,它会减慢速度。在 JVM 获取更多内存的过程中,垃圾回收花费了相当多的时间。而且我认为获取内存是一项昂贵的任务。

我如何确保 JVM 实际上遵守起始堆大小参数?

更新:这个应用程序创建了很多对象,其中大部分很快就会消亡。一些结果对象需要保留在内存中(从年轻堆中转移出来)。在此操作期间,所有这些对象都需要在内存中。运行后可以看到young heap中的所有对象都被claim成功了。所以没有内存泄漏。

当堆大小达到 3G 时,相同的操作可以顺利运行。这清楚地表明获取内存所需的额外时间。

这个 Sun JDK 5。

最佳答案

如果我没记错的话,Java 会尝试从操作系统获取内存预留。因此,如果您要求 3 GB 作为 Xms,Java 将询问操作系统是否可用,但不会立即使用所有内存……它甚至可能会保留它(而不是分配它)。但这些都是细节。

通常,JVM 在开始严格的老年代垃圾收集之前会运行到 Xms 大小。新生代GC一直在运行。通常 GC 仅在旧代 GC 运行且 VM 介于 Xms 和 Xmx 之间时才会引起注意,或者,如果您将其设置为相同的值,则大致达到 Xmx。

如果您需要大量内存用于短期对象,请通过将年轻区域设置为...来增加该内存区域...假设 1 GB -XX:NewSize=1g 因为这样做的成本很高将年轻“桶”中的“垃圾”移至老一代。因为万一它还没有变成真正的垃圾,JVM 会检查垃圾,没有找到,在幸存者空间之间复制它,最后移动到老年代。因此,当您知道自己没有垃圾时,请尝试抑制对年轻一代垃圾的检查,并以某种方式推迟...

试试吧!

关于java - 如何确保 JVM 以 Xms 的值启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/862176/

相关文章:

java - Java Flight Recorder 如何对 native 帧进行采样 (jni/jna)

java - Swing Timer 不被垃圾回收

java - 生产服务器中的 tomcat 超出了 GC 开销限制

java - 附加到文本文件

java - Android-使用 Intent 通过按钮单击将值发送到另一个 Activity 的 getStringExtra 的空指针异常

Java 垃圾收集器 G1GC 花费很长时间等待 'Object Copy'(疏散暂停)

java.awt.headless 问题

java - 每个 JVM 实例上开始执行多少线程?

java - 在循环中执行 MavenCli 时出错(maven-embedder)?

java - Hibernate 不支持哪种类型的数据库映射