【问题标题】:What is the difference between "XXMaxPermSize" and "xmx" in eclipse.ini?eclipse.ini 中的“XXMaxPermSize”和“xmx”有什么区别?
【发布时间】:2014-08-13 22:09:03
【问题描述】:

我试图找出两者之间的区别,因为我的 Eclipse 有时会遇到“内存不足”错误。我有很多内存可供使用,所以我试图找出增加或减少哪些内存以及他们如何让它正常工作。以下是文件内容:

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20130807-1835
-clean
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
1024m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Xms256m
-Xmx2000m

【问题讨论】:

  • 永久空间和堆空间
  • 什么是 permgen(以及它与 eclipse 有何关系)以及它与堆有何不同?
  • 我相信 Permgen 堆已在 Java 8 中被删除。我认为它的选项现在已被弃用或被删除。 Permgen 堆是 JVM 决定存储所有它虽然是永久的,主要是类定义的地方。这导致了动态加载/卸载类的问题,因为它从来没有被清扫为垃圾。
  • 好吧,假设我有一个非常大的项目,我应该更担心 MaxPermSize 而不是堆,因为它必须存储与项目的每个类关联的所有数据?
  • permgen 空间通常只包含类的定义和一些通常不会超出范围的其他元数据。它不存储用 new 分配的对象。大多数情况下,您不必担心 permgen 空间不足,除非您计划在运行时“重新加载”类。

标签: java eclipse memory jvm jvm-arguments


【解决方案1】:

当您遇到错误时,您需要仔细阅读,因为通常每个字都很重要。例如,当您收到 OOME 时,您会看到一些单词作为消息。这很重要,因为您可以获得 OOME 的原因有很多,其中两个最常见的是;

  • 缺少由-Xmx 控制的堆空间(对象实例)
  • 缺少由-XX:MaxPermSpace= 控制的perm gen(代码)

注意:Java 8 没有“Perm Gen”,它有一个“元空间”,它做同样的事情,但工作方式大不相同,我怀疑他们重命名它以避免混淆。

此错误还有其他原因,例如使用过多的直接内存或无法创建新线程,但这些原因相对较少。

如果你认为这个答案有一点需要阅读整个消息,而不仅仅是错误本身,如果你不知道这意味着什么,谷歌通常会这样做;)

我这样说是因为 StackOverflow 上经常会发布一个关于“发生错误”的问题,而第一条评论是“发生了什么错误”,因为一旦发布,问题就很明显(对于知道这意味着什么的人)大多数时候是什么问题。因此,当您阅读错误消息时,您需要假设它试图告诉您一些事情,但您不知道它的含义是的,我经常看到新的错误消息,但我不知道它们的含义 em>

【讨论】:

  • 元空间是一个不太永久的永久空间。使用稍少的元元数据存储相同的内容。一个主要区别是元空间的管理方式与其他堆空间相同,并且可以进行垃圾回收,尽管它的频率要低得多。
  • @Smith_61 ... 并且元空间带有自己的调整参数,这些参数特定于其工作方式。
  • 有趣的是,元空间也可能以与 permgen 空间类似的方式耗尽内存。所以我同意 Metaspace 基本上只是一个重命名的 Permgen 空间。
【解决方案2】:
-XX:MaxPermSize=64m 

Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

>= 8 版本中不再存在

-Xmxn

指定内存分配池的最大大小(以字节为单位)。此值必须是大于 2MB 的 1024 的倍数。附加字母 k 或 K 表示千字节,或附加 m 或 M 表示兆字节。默认值为 64MB。在Solaris 7 and Solaris 8 SPARC platforms and 2000m on Solaris 2.6 and x86 platforms, minus overhead amounts. 上,此值的上限约为 4000m

【讨论】:

    【解决方案3】:

    尝试查看this 页面以进一步阅读,但是 Jigar Joshi 关于永久空间和堆空间之间差异的回答是正确的。

    此页面的引文是:

    假设一组JVM参数为

    -Xms3072M -Xmx3072M -XX:+AggressiveHeap -XX:MaxPermSize=1024M

    疑问是:当我们说 MaxPermSize = 1024M 是否意味着它取自 我为 Xms/Xmx 设置的 3072M ?

    答案是否定的,PermSize 是用户在 JVM 选项上设置的 -Xmx 值的附加值。但是 MaxPermSize 允许 JVM 能够将 PermSize 增长到指定的数量。最初加载 VM 时,MaxPermSize 仍将是默认值(-client 为 32mb,-server 为 64mb),但在需要之前不会实际占用该数量。另一方面,如果您将 PermSize 和 MaxPermSize 都设置为 256mb,您会注意到整体堆比 -Xmx 设置增加了 256mb。*

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      相关资源
      最近更新 更多