如果我有 8GB RAM 并且在 64 位 JVM 上使用以下内容
- 最大堆大小 6144MB
- 最大烫发空间 2048MB
- 堆栈大小 2MB
Q1:perm gen 空间是从最大堆分配还是单独分配?
Q2:如果分开,那么具有上述设置的 jvm 会启动还是会因为堆 + permgen + 堆栈 + 程序数据超过总 RAM 而出现错误?
如果我有 8GB RAM 并且在 64 位 JVM 上使用以下内容
Q1:perm gen 空间是从最大堆分配还是单独分配?
Q2:如果分开,那么具有上述设置的 jvm 会启动还是会因为堆 + permgen + 堆栈 + 程序数据超过总 RAM 而出现错误?
首先请记住,您设置的参数-Xmx
(因为我假设您正在设置堆大小)是 Java 代码可用的堆大小,而不是 JVM 将消耗的内存量。不同之处在于 JVM 保留的管理结构(垃圾收集器结构、JIT 开销等),有时是由本机代码、缓冲区等分配的内存。这个额外内存的大小取决于 JVM 版本、您正在运行的应用程序和其他因素,但我看到 JVM 分配的 RAM 是应用程序可见的堆大小的两倍。对于一般情况,我通常认为 50% 是安全边际,20-30% 是可以接受的。如果您将堆大小设置为接近机器中的 RAM 量,您将遇到交换并且性能会受到影响。
现在对于列举的问题:
Perm gen 至少在 Oracle 的 JDK 6 中是与堆分开的空间。它是分开的,因为它经历了与常规堆完全不同的内存管理规则。顺便说一句,2 GB 的 pergen 空间是巨大的 - 你确定你真的需要它吗?
关于第二个问题,见上文。如果这是 Oracle 的 JDK,您可能会遇到麻烦,因为 perm 和 heap 相加,但是会有额外的内存,通常大约是 6 GB 堆的 20-50%,再加上堆和 perm 空间,这将不仅仅是你的内存。起初尝试此设置可能有效,但一旦堆和永久代空间使用量都接近其配置的限制,您可能会耗尽内存。
heap 和 permgen 是 JVM 的不同内存部分。因此,您将消耗系统上几乎所有的内存。最好留出 20% 的内存以供操作系统/其他任务正常执行。
此外,2 GB 的烫发空间是一个巨大的数字。您是否看过 jar 优化意味着类路径中只存在相关的类?
这取决于 JVM 和 JVM 的版本。
在 Hotspot Java 6中,PermGen空间独立于最大堆大小参数(-Xmx
并且-Xms
仅控制 Young/OldGen 大小)。PermGen 空间大小由-XX:PermSize
和给出-XX:MaxPermSize
。请参阅Java SE 6 HotSpot[tm] 虚拟机垃圾收集调优
更新:在 Hotspot Java 8中,不再有 PermGen 空间,对象驻留在年轻/老一代空间中。