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

Java:为什么存在MaxPermSize?

越学博
2023-03-14
问题内容

为什么存在MaxPermSize?


问题答案:

我还没有发现任何东西可以表明他们为什么要做出设计来对永久发电量有最大限制的决定。但是我认为这样做是出于几个原因。

  1. 它使实现起来更加容易,GC绝对是不平凡的,因此以任何方式简化实现可能是一个好主意。

  2. YAGNI(您可能会需要它)大多数应用程序都加载固定数量的类,并且通常不是特别大,因此它们可能已针对常见情况进行了优化,并选择了合理的默认值并使其可配置。

  3. 假设您的烫发代大小正在增长到无法预料的大,那么您可能在类加载器中出错(或者需要重新考虑您的体系结构)。即使在确实在运行时生成类(或执行其他此类技巧)的应用程序中,生成的类的数量也通常是固定的,因此您应该能够调整maxperm以满足您的需求。

  4. 我不是Java类加载和垃圾回收的所有细节方面的专家,但是它们都是JVM的复杂部分,因此我想他们将尝试使这两个组件尽可能保持正交,并允许perm gen增长动态地可能会以复杂的方式将这两个组件耦合在一起(特别是因为这两个组件都具有严格的线程考虑)

  5. 限制最大烫发产生的数量可能会带来一些性能上的好处,使其增长可能涉及到集合的额外复制,或者可能意味着烫发产生不再存在于连续的地址空间中,这可能会影响其他算法的方式管理收藏。

显然这些都是推测。但是,即使所有这些都不对,我绝对不认为选择固定大小的太阳是“愚蠢的”,但也许还有更多的工程和实现方面的考虑超出了我的梦想:)



 类似资料:
  • 问题内容: 我知道在该主题上也有类似的帖子,但是它们并没有完全解决我的问题。当您这样做时: (显然)大多数时间都会打印,因为以某种方式缓存了[-128,127]范围内的整数。但: 会回来的。我知道我正在请求一个Integer的新实例,但是由于装箱的原语在Java中是不可变的,并且已经有了执行“正确的事情”的机制(如第一种情况所示),为什么会发生这种情况? 如果Integer的所有实例(具有10)都

  • 我正在使用Bukkit API 1.8和Java7。 我有一个重复的任务,循环通过服务器上的所有玩家,并将他们的盔甲随机设置为皮革,链甲等... 当我使用、等方法时...我像往常一样更新他们的库存,但由于这个任务是每6滴答运行一次,它运行得很快。因此,当玩家试图发射弓时,每次此任务运行时弓都会重置其威力。 因为我知道更新库存有问题,所以我尝试删除方法。 我如何在保持任务运行的同时保持弓不重置? 我

  • 问题内容: 在下面获得了以下生产代码,我正在将其用于新驱动程序。portName是COM4,并且该端口存在于PC上(并且我可以通过超级终端连接到该端口),那么Javacomm为什么会抛出NoSuchPortException?COM4在设备mgr中显示正常。太 问题答案: 尝试使用枚举系统上可用端口的列表,并打印列出的内容。您确定在正确的文件夹中安装了jarfiles和dll吗?如果是,则尝试使用

  • 问题内容: 维基百科说:“一个终止但从未被其父级等待的子进程变成了僵尸进程。” 我运行此程序: 这会创建一个僵尸进程,但我不明白为什么在这里创建了僵尸进程? 该程序的输出是 但是在这种情况下,为什么“子进程终止但没有被其父进程等待”呢? 问题答案: 在您的代码中,创建了僵尸(带有以下箭头的注释): 为什么?因为你从来没有上过。调用时,它将返回有关进程的事后信息,例如其退出代码。不幸的是,当进程退出

  • 问题内容: 我正在尝试运行查询: 但是我得到了错误:“没有这样的功能:instr”。这使我感到困惑,因为该网站明确指出了该功能的存在。有人知道发生了什么吗? 附言:我也尝试在SQLiteSpy中查询,该查询给出了相同的错误。 问题答案: 根据“更改历史记录”,此功能已在3.7.15版中添加: 2012-12-12(3.7.15) 添加了instr()SQL函数。 确保您正在运行最新版本。 如果无法

  • 每当有人在这里询问关于的问题时,总会有一个相当笼统的回答:“C++就是这么做的,使用delete[]”。作为一个普通的C背景,我不明白为什么需要一个不同的调用。 使用/,您的选项是获取一个指向连续内存块的指针,并释放一个连续内存块。在实现land中会出现一些东西,并知道您根据基址分配的块的大小,以便在您必须释放它时使用。 没有函数。我看到过一些与此切线相关的其他问题的疯狂理论,比如调用只会释放数组