从程序员的概念上讲,您可以辩称“永久一代”是毫无意义的。如果您需要加载一个类或其他“永久”数据,并且还有剩余的存储空间,那么原则上您也可以将其加载到某个地方,而不用担心将这些项的集合称为“世代”。
但是,其基本原理可能是:
- 使所有代码/类元数据在内存空间中靠近在一起有潜在的好处(例如,从处理器缓存的角度来看),并且为了保证这一点,分配固定大小的区域更加容易;
- 同样,存储代码/类元数据的内存空间可能具有某些“特殊”属性(特别是,如果可以帮助,您不希望将其分页到磁盘),并且系统可能无法设置此类属性以非常精细的方式存储在内存中,因此将所有“特殊”对象放在一个(或少量)连续的块或内存空间中更为实用;
- 将所有永久性对象放在一起有助于避免碎片化剩余的存储空间,而且,最实用的方法是从一开始就分配一个固定大小的连续内存块。
因此,正如我所看到的,大多数时候分配永久“代”的原因实际上是出于实际实现的原因,而不是因为程序员确实非常在意。
另一方面,这种情况通常也不会对程序员造成可怕的影响:所需的永久生成量通常是可以预测的,因此您应该能够以适当的回旋余地分配所需的数量。因此,如果您发现自己出乎意料地超出了分配量,则很可能表明“某些严重问题是错误的”。
注意可能是这样的情况,PermGen最初旨在解决的一些问题在具有更大处理器缓存的现代64位处理器上并不是那么大的问题。如果在将来的Java版本中将其删除,则这很可能表明JVM设计人员认为它已经“达到了目的”。



