为什么PermGen的默认大小如此之小?

限制Java JVM上Permgen空间大小的目的是什么? 为什么不总是将其设置为最大堆大小? 为什么Java默认为64MB这样一小部分? 他们是否试图通过这样做来强迫人们注意代码中的permgen问题?

如果我的应用使用85MB的permgen,那么将它设置为96MB可能是安全的,但为什么将它设置得如此之小以至于它只是主堆的真正一部分? 让JVM能够像堆一样使用PermGen不是很有效吗?


从概念上讲,对于程序员来说,你可能会认为“永久代”基本上毫无意义。 如果您需要加载类或其他“永久性”数据,并且剩余内存空间,那么原则上可以将它加载到某个地方,而不必关心将这些项目的聚合称为“代”。

然而,理由可能更多的是:

  • 从内存空间中将所有代码/类元数据集中在一起可以带来潜在的好处(例如,从处理器缓存的角度来看),并且保证这样可以更容易地分配固定大小的区域;
  • 类似地,存储代码/类元数据的内存空间可能具有某些“特殊”属性(特别是,如果可以帮助它,您不希望它将页面分派到磁盘),并且系统可能无法设置这些属性在内存中以非常细粒度的方式存储,因此将所有“特殊”对象放在一个(或少量)连续的块或存储空间中更加实用;
  • 将永久对象放在一起有助于避免碎片化剩余的内存空间,再次,最实际的方法是从一开始就分配一块连续的固定大小的内存块。
  • 所以当我看到事物时,大多数时候分配永久“代”的原因实际上是出于实际的实施原因,而不是因为程序员真的非常关心。

    另一方面,对于程序员来说,情况通常并不可怕:永久生成所需的数量通常是可预测的,因此您应该能够以合适的余地分配所需的数量。 所以如果你发现你意外地超出了分配,这可能是一个“严重错误的信号”。

    注意事项PermGen最初设计要解决的一些问题可能并非现代64位处理器中具有较大处理器缓存的大问题。 如果在未来的Java版本中将其删除,这可能表明JVM设计人员认为它现在“已达到其目的”。


    PermGen将设置为在JDK8中消失。

    限制Java JVM上Permgen空间大小的目的是什么?

    不耗尽资源。

    为什么不总是将其设置为最大堆大小?

    PermGen不是Java堆的一部分。 此外,即使是这样,对于使用类元数据和常量字符串填充堆的应用程序也没有多大帮助,因为您会因此而得到“OutOfMemoryError:Java堆大小”错误。


    PermGen是分配类数据和其他静态内容(如字符串文字)的地方。

    你应该把内存分配给你的应用程序数据的Java堆( XmsXmx ,其中年轻(短命)和持久对象去(当JVM意识到他们需要保持更长的时间))。

    因此,历史悠久的PermGen 64MB默认值可能是任意的,但是您明确地设置它可以让您知道(并控制)您的应用程序导致JVM存储的静态数据量。

    链接地址: http://www.djcxy.com/p/82795.html

    上一篇: Why is the default size of PermGen so small?

    下一篇: Is java PermGen space part of the total VM memory?