限制Java JVM上Permgen空间大小的目的是什么?为什么不总是将其设置为等于最大堆大小?Java为什么默认为这么少的64MB?他们是否正在试图通过这种方式迫使人们注意代码中的Permgen问题?
如果我的应用使用85MB的permgen,那么将其设置为96MB可能是安全的,但是如果它只是主堆的一部分,为什么还要设置得如此之小呢?允许JVM使用堆允许的PermGen效率不高吗?
从程序员的概念上讲,您可以辩称“永久一代”是毫无意义的。如果您需要加载一个类或其他“永久”数据,并且还有剩余的存储空间,那么原则上您也可以将其加载到某个地方,而不用担心将这些项的集合称为“世代”。
但是,其基本原理可能是:
因此,正如我所看到的,大多数时候分配永久“代”的原因实际上是出于实际实现的原因,而不是因为程序员确实非常在意。
另一方面,这种情况通常也不会对程序员造成可怕的影响:所需的永久生成量通常是可以预测的,因此您应该能够以适当的回旋余地分配所需的数量。因此,如果您发现自己出乎意料地超出了分配量,则很可能表明“某些严重问题是错误的”。
注意可能是这样的情况,PermGen最初旨在解决的一些问题在具有更大处理器缓存的现代64位处理器上并不是那么大的问题。如果在将来的Java版本中将其删除,则这很可能表明JVM设计人员认为它已经“达到了目的”。