PermGen抑制的后果

时间:2013-09-11 08:52:05

标签: java memory-management garbage-collection java-8

next java release附带来自Hotspot JVM的removal of the permanent generation。 java开发人员应该知道什么后果?

2 个答案:

答案 0 :(得分:1)

来自您关联的JEP:

  
    

将实际的字符串和类静态移动到Java堆可能会导致内存不足异常或GC数量增加。

  

这是我能想到的主要后果之一。您的应用程序可能会尝试加载新类,从而触发GC甚至获取OOME,因为没有为此类数据保留的显式内存区域。某些应用程序可能能够从OOME中恢复,但我不确定在类加载过程中抛出它是否属实,尤其是对于使用PermGen构建的遗留应用程序。

另一方面,不必明确配置PermGen会很好,特别是如果不需要更大的部分。这也可能使PermGen中的数据更容易GCing并降低那些可怕的PermGen空间错误的风险。

但是,如果存在内存泄漏,删除PermGen可能只会使跟踪它们变得更加困难。如果由于某种原因(例如在较旧的jboss版本中)无法卸载类,那么阻止哪个内存部分没有多大区别。泄漏仍然存在,稍后可能会变得明显,因为限制较少。

这只是我的2美分,我可能在这里完全错了,但这些是我目前可以想到的含义。

答案 1 :(得分:0)

是的,您是对的PermGen已从Java 8中删除,并替换为Metaspace

对于Java Developer,我认为没有任何后果,但是,他们需要知道Metaspace所需的新JVM参数。

  • 显然,PermSize MaxPermSize JVM参数被忽略,你永远不会得到java.lang.OutOfMemoryError:PermGen错误。
  • 新的Metaspace参数是-XX:MaxMetaspaceSize和-XX:MetaspaceSize
  • -XX:MaxMetaspaceSize :默认为无限
  • -XX:MetaspaceSize :tuning标志定义元空间的初始大小如果不指定此标志,则Metaspace将根据运行时的应用程序需求动态调整大小。
  • 您需要使用jmap -clstats
  • ,而不是使用jmap -permstat
  • jstat -gc选项显示Metaspace而不是PermGen。