【发布时间】:2010-10-26 02:51:45
【问题描述】:
当我运行一个起始堆大小为 3G(由 -Xms3072m VM 参数设置)的 java 程序时,JVM 不会以该大小开始。它从 400m 左右开始,然后根据需要不断获取更多内存。
这对我来说是一个严重的问题。我知道 JVM 会在一段时间后需要上述数量。当JVM根据需要增加它的内存时,它就会变慢。在 JVM 获取更多内存期间,大量时间用于垃圾收集。而且我认为内存获取是一项昂贵的任务。
我如何确保 JVM 确实尊重起始堆大小参数?
更新:这个应用程序创建了很多对象,其中大部分很快就死掉了。一些生成的对象需要留在内存中(这些对象从年轻堆中转移出来)。在此操作期间,所有这些对象都需要在内存中。运行后,可以看到young heap中的所有对象都被认领成功了。所以没有内存泄漏。
当堆大小达到 3G 时,同样的操作可以顺利运行。这清楚地表明需要花费额外的时间来获取内存。
这个 Sun JDK 5。
【问题讨论】:
-
你在使用 Sun 的 JVM 吗?
-
只是一个问题:你的机器有多少主存,启动程序时有多少空闲?
-
主机有32G内存。虽然,“top”只显示了几 Gig 的可用内存,但 java 程序可以轻松地分配 10G。
-
我的想法是,您即将进行交换,当 Java 分配另一个内存区域时,操作系统必须负责交换和压缩。
标签: java garbage-collection jvm heap-memory