一尘不染

为什么PermGen的默认大小这么小?

java

限制Java
JVM上Permgen空间大小的目的是什么?为什么不总是将其设置为等于最大堆大小?Java为什么默认为这么少的64MB?他们是否正在试图通过这种方式迫使人们注意代码中的Permgen问题?

如果我的应用使用85MB的permgen,那么将其设置为96MB可能是安全的,但是如果它只是主堆的一部分,为什么还要设置得如此之小呢?允许JVM使用堆允许的PermGen效率不高吗?


阅读 254

收藏
2020-12-03

共1个答案

一尘不染

从程序员的概念上讲,您可以辩称“永久一代”是毫无意义的。如果您需要加载一个类或其他“永久”数据,并且还有剩余的存储空间,那么原则上您也可以将其加载到某个地方,而不用担心将这些项的集合称为“世代”。

但是,其基本原理可能是:

  • 使所有代码/类元数据在内存空间中靠近在一起有潜在的好处(例如,从处理器缓存的角度来看),并且为了保证这一点,分配固定大小的区域更加容易;
  • 同样,存储代码/类元数据的内存空间可能具有某些“特殊”属性(特别是,如果可以帮助,您不希望将其分页到磁盘),并且系统可能无法设置此类属性以非常精细的方式存储在内存中,因此将所有“特殊”对象放在一个(或少量)连续的块或内存空间中更为实用;
  • 将所有永久性对象放在一起有助于避免碎片化剩余的存储空间,而且,最实用的方法是从一开始就分配一个固定大小的连续内存块。

因此,正如我所看到的,大多数时候分配永久“代”的原因实际上是出于实际实现的原因,而不是因为程序员确实非常在意。

另一方面,这种情况通常也不会对程序员造成可怕的影响:所需的永久生成量通常是可以预测的,因此您应该能够以适当的回旋余地分配所需的数量。因此,如果您发现自己出乎意料地超出了分配量,则很可能表明“某些严重问题是错误的”。

注意可能是这样的情况,PermGen最初旨在解决的一些问题在具有更大处理器缓存的现代64位处理器上并不是那么大的问题。如果在将来的Java版本中将其删除,则这很可能表明JVM设计人员认为它已经“达到了目的”。

2020-12-03