当前位置: 首页 > 面试题库 >

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

农建弼
2023-03-14
问题内容

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

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


问题答案:

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

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

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

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

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

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



 类似资料:
  • 据此: 在系统中安装了Maven之后,下一步就是对其进行微调以获得最佳性能。默认情况下,最大堆分配为256-512 MB(-XMS256M到-XMX512M)。在构建大型复杂Java项目时,此默认限制不起作用,建议您至少拥有1024 MB的最大堆。 现在,我认为堆空间和permgen空间的max和min值是由JVM设置的。Maven只能通过我们设置的MAVEN_OPTS env变量来设置它们。那么

  • 我不知道为什么,为什么我不能使用完整的64位空间例如操作数?和Sign有关吗?或者为什么会有这个限制?(那么,C是否使用前缀对int进行操作(正如前面提到的,前缀只适用于特定指令,而不适用于整个段,它应该是(大小,地址或操作数)默认值,并包含在段描述符中)。 我理解正确吗?

  • 问题内容: CSS3定义了新的长度单位叫做。这使我们能够计算与根元素(html元素)相关的元素。 为了更轻松地进行计算,我们通常假设根元素为,因此CSS通常如下所示: 因此,每个元素高度与都相对于,例如 我找不到为什么我们假设可以乘以?我们如何才能相信每个浏览器都具有相同的基本值?是否有关于预定义的标准描述? 问题答案: 该基准由用户在浏览器中预定义的首选项确定。 在几乎所有浏览器中,16px是比

  • 在添加新的键值对时,我有几个关于重建哈希映射的问题。我将根据这些事实提出问题(它们对于Oracle JVM是正确的,不确定它们对于其他JVM是否正确): 每次当HashMap增长大于阈值(阈值=加载因子*条目数)时,Resize将重建HashMap,使其具有更大的内部表数组。新创建的条目放在哪个存储桶中并不重要,Map仍然会变得更大。即使所有条目都进入一个bucket(即它们的键“返回相同的数字)

  • 我对具有“洞”的元组感兴趣。这些孔是空结构。所有孔都将具有相同的类型,在此处称为“空”。 为了说明起见,让 。正如我所料, 。然而, 我不明白为什么最后两种类型的大小不是2(在

  • 我正在使用JAXP XSLT API(javax.xml.transform)来转换xml文件。 TransformerFactory的javadoc表示:它使用以下有序查找过程来确定要加载的TransformerFactory实现类: 使用javax。xml。使改变TransformerFactory系统属性 使用JRE目录中的属性文件“lib/jaxp.properties”。此配置文件采用标