为什么PermGen的默认尺寸这么小?(Why is the default size of Per

2019-08-02 23:21发布

什么是限制在Java的JVM PermGen的空间大小的目的是什么? 为什么不总是将其设置为最大堆大小? 为什么Java默认这样的少数64MB的? 他们试图迫使人们做这个要注意的PermGen在他们的代码的问题?

如果我的应用程序使用的PermGen的85MB,那么它可能是安全的,它设置为96MB,但为什么设置如果主堆的只是一部分真的就那么少呢? 那岂不是有效的,使JVM为堆允许使用尽可能多的PermGen?

Answer 1:

从概念到程序员,你可能会说,一个“永久的一代”主要是没有意义的。 如果您需要加载类或其他“永久”数据,并且还有剩余的内存空间,然后在原则上,你可能也只是加载的地方,并没有在意调用这些项的“一代”的总可言。

然而,理由是可能更认为:

  • 有可能从在存储空间具有的所有代码/类的元数据一起靠近一个好处(例如从一个处理器高速缓存点),并保证这更容易分配固定大小的区域(一个或多个);
  • 同样,在代码/类的元数据被存储潜在的内存空间具有一定的“特殊”属性(值得注意的是,你不希望它得到分页到磁盘,如果你能帮助它),并且系统可能无法设置这样的性质在一个非常精细的方式存储,使得它是更实际的具有所有的“特殊”的对象一起在一个(或少数)连续块或存储器空间;
  • 有永久对象一起有助于避免碎片化的剩余内存空间,并再次,要做到这一点,最实用的方法是从一开始就分配的固定大小的内存一个连续的块。

所以,当我看到的东西,大部分时间都分配一个永久的“一代”的原因确实是出于实际实现的原因不是因为程序员真正关心可怕得多。

在另一方面,这种情况通常不是程序员可怕之一:需要永久的产生量通常是可预测的,所以,你应该能够体面的余地分配所需的量。 所以,如果你发现你会意外地超过了分配,这很可能是一个信号,即“正经事是错误的”。

NB,则可能是一些认为PermGen的初衷是要解决的问题是不是与较大的处理器缓存现代的64位处理器这样的大问题的情况下。 如果在Java的未来版本中删除,这可能是一个迹象,表明JVM设计师觉得它现在已经“功成身退”。



Answer 2:

PermGen的设置在JDK8消失。

什么是限制在Java的JVM PermGen的空间大小的目的是什么?

不耗尽资源。

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

PermGen的不是 Java堆的一部分。 此外,即使它是,它不会有很大帮助的应用程序,以填补级元数据和常量字符串堆,因为你会再拿到“的OutOfMemoryError:Java堆大小”的错误来代替。



Answer 3:

PermGen的就是数据和其他静态的东西(如字符串文字)进行分配。

你宁愿分配内存以Java堆的应用程序数据( XmsXmx ,其中年轻的 (短期)和终身的对象去(当JVM的实现,他们需要保持的时间更长))。

所以,历史悠久的PermGen 64MB默认可以是任意的,但有明确设置它可以让你知道(控制)您的应用程序有多少静态数据导致JVM来存储。



文章来源: Why is the default size of PermGen so small?