4年前 (2020-09-18)  爪哇岛 |   抢沙发  2028 
文章评分 0 次,平均分 0.0

我们收到了一些关于G1垃圾收集器的问题,以及永久一代的使用。似乎有些混乱

当G1用作垃圾时,热点JVM不使用永久生成

JDK 7:PermGen永久代

JDK 7及其更新版中仍然存在永久代,所有的垃圾回收器都在使用。在JDK7中,删除永久生成已启动,并且部分数据驻留在永久生成被移到Java堆或本机堆。

永久生成并没有完全删除,它仍然存在于jdk7中以及它的更新。这是从永久性建筑中移走的东西的清单

JDK7中的生成:

  • 符号已移动到本机堆
  • 内部字符串被移到Java堆中
  • 类静态被移到Java堆中

JDK7:G1和PermGen

使用G1收集器,PermGen只能在完整的GC中收集,这是一个停止世界(STW)GC。

如果G1运行得最好,但它不能完成完整的GCs。G1调用full gc 仅当PermGen已满或应用程序分配速度更快时

比G1可以同时收集垃圾。

使用CMS垃圾收集器,我们可以使用

-XX: +CMSClassUnloadingEnabled以收集CMS并发的PermGen空间循环。G1没有等效选项。G1只在stop-the-worldGCs全站期间收集PermGen。

我们可以使用PermSize和MaxPermSize选项来调整PermGen空间大小根据应用程序需要而定。

JDK8:PermGen公司

jdk8中永久性的一代已经被完全删除了。

这项工作是在错误的情况下完成的 http://bugs.openjdk.java.net/browse/JDK-6964458。

选项PermSize和MaxPermSize在jdk8中也被删除了。

JDK8:元空间metaspace

在jdk8中,类元数据现在存储在本机堆中这个空间叫做元空间。为添加了一些新标志

JDK 8中的元空间:

-XX:MetaspaceSize=<NNN>

其中<NNN>是初始空间量(初始高水位线)分配给类元数据(以字节为单位),它可能会导致

垃圾回收以卸载类。数额是近似的。在首先达到高水位线,下一个高水位线由垃圾收集器

-XX: MaxMetaspaceSize=<NNN>

其中<NNN>是为类分配的最大空间量元数据(字节)。此标志可用于限制空间量为类元数据分配。这个值是近似值。默认情况下没有设置限制。

-XX: MinMetaspaceFreeRatio=<NNN>

其中<NNN>是类元数据容量的最小百分比在GC之后释放,以避免空间量的增加(高水位线)分配给将引发垃圾的类元数据收集。

-XX: MaxMetaspaceFreeRatio=<NNN>

其中<NNN>是类元数据容量的最大百分比在GC之后释放,以避免空间量的减少(高水位线)分配给将引发垃圾的类元数据收集。

细节可以参考这篇文章:https://javakk.com/421.html

default class

元数据分配仅受可用本机内存量的限制。我们可以使用新选项MaxMetaspaceSize来限制本机内存量用于类元数据。它类似于MaxPermSize。一个垃圾收集被诱导来收集死的类加载器

当类元数据使用量达到MetaspaceSize(12字节32位客户端虚拟机和大小更大的32位服务器虚拟机上的16MB64位虚拟机)。将MetaspaceSize设置为更高的值以延迟诱导的垃圾回收。在诱导垃圾收集之后,类元数据的使用需要诱导下一次垃圾收集可能会增加。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/428.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册