12

假设我使用以下参数启动我的 java VM:

-Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m

512m PermGen 空间是添加到 1024m 内存中还是其中的一部分?或者换句话说,我的总内存消耗是 1536m 还是 1024m?在后一种情况下,这是否意味着应用程序只有 512m 用于 PermGen 空间以外的用途?

如果这个问题表明对 PermGen 空间缺乏了解,请告诉我。;-)

4

3 回答 3

16

-Xms-Xmx参数指的是堆内存,而 PermGen 空间是一个单独的内存池。

换句话说,您的 Java 应用程序可用的总内存大小将是 1.5 GiB 而不是 1 GiB,并且您将获得用于堆分配对象的全部 GB 空间。

于 2010-11-19T09:58:11.430 回答
1

我刚刚通过谷歌浏览了这个页面。无论 PerGen 是否是堆的一部分,这都会引起一定的混淆:答案是“堆被分解成更小的部分/代,这些部分是:年轻代、老一代或老一代以及永久代”。这是甲骨文至少可以说的。与网络域上的观众相比,按照原创者所说的更有意义。

关于 PermGen 的简短说明: 永久生成包含 JVM 所需的元数据,用于描述应用程序中使用的类和方法。JVM 在运行时根据应用程序使用的类填充永久代。此外,Java SE 库类和方法可能存储在这里。

于 2017-08-04T04:39:10.730 回答
0

在 Sun 的 JVM 中,永久代不是堆的一部分。它是类定义和相关数据以及实习字符串所在的不同空间。

于 2013-07-30T13:39:53.673 回答