当我运行一个起始堆大小为 3G(由 -Xms3072m VM 参数设置)的 java 程序时,JVM 不会以该大小开始。它从 400m 左右开始,然后根据需要不断获取更多内存。
这对我来说是一个严重的问题。我知道 JVM 会在一段时间后需要上述数量。当JVM根据需要增加它的内存时,它就会变慢。在 JVM 获取更多内存期间,大量时间用于垃圾收集。而且我认为内存获取是一项昂贵的任务。
如何确保 JVM 实际上尊重起始堆大小参数?
更新:这个应用程序创建了很多对象,其中大部分很快就死掉了。一些生成的对象需要保留在内存中(从年轻堆中转移出来)。在此操作期间,所有这些对象都需要在内存中。运行后,可以看到young heap中的所有对象都被认领成功了。所以没有内存泄漏。
当堆大小达到 3G 时,同样的操作可以顺利运行。这清楚地表明需要额外的时间用于获取内存。
这个 Sun JDK 5。