3年前 (2020-11-22)  jvm |   抢沙发  475 
文章评分 0 次,平均分 0.0

正如您在java8 permgen中看到的,PermGen空间已经停止使用。在JDK 8中,类元数据现在存储在本机堆中,这个空间称为元空间

PermSizeMaxPermSize JVM参数将被忽略,如果在启动时出现,则会发出警告。

元空间内存分配模型

类元数据的大多数分配现在都是从本机内存中分配的。

用于描述类元数据的klasse已被删除。

超空间容量

默认情况下,类元数据分配受可用本机内存量的限制(容量当然取决于是否使用32位JVM而不是64位以及操作系统虚拟内存可用性)。

有一个新的标志可用(MaxMetaspaceSize),允许您限制用于类元数据的本机内存量。如果不指定此标志,元空间将根据运行时的应用程序需求动态调整大小。

元空间垃圾回收

一旦类元数据使用量达到“MaxMetaspaceSize”,就会触发对死类和类加载器的垃圾回收。

显然需要对元空间进行适当的监视和调优,以限制此类垃圾收集的频率或延迟。过多的元空间垃圾收集可能是类、类加载器内存泄漏或应用程序大小不足的症状。

Java堆空间影响

一些杂项数据已移动到Java堆空间。这意味着您可能会在未来的jdk8升级后观察到Java堆空间的增加。

元空间监测

Metaspace用法可从HotSpot 1.8详细GC日志输出中获得。

根据我们对b75的测试,JstatJVisualVM还没有更新,旧的PermGen空间引用仍然存在。

如何在Java8中设置元空间

JDK 8中为Metaspace添加了一些新标志:

-XX:MetaspaceSize

其中是为类元数据分配的初始空间量(初始高水位线)(以字节为单位),这些空间可能导致垃圾回收卸载类。数额是近似的。在第一次达到高水位线后,下一个高水位线由垃圾收集器管理

-XX:MaxMetaspaceSize

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

-XX:MinMetaspaceFreeRatio

其中,是GC之后可用的类元数据容量的最小百分比,以避免为类元数据分配的空间量(高水位线)的增加,从而导致垃圾回收。

-XX:MaxMetaspaceFreeRatio

其中是GC之后释放的类元数据容量的最大百分比,以避免为将导致垃圾回收的类元数据分配的空间量(高水位线)减少。

JVM设置

我们使用了以下打印选项:

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

生成GC日志文件。除此之外,我们还设置了:

-XX:MetaspaceSize=128m

指定初始高水位线以通过诱导GC事件触发元空间清理。

在GC日志文件中,可以找到以下条目:

[元空间:21013K->21013K(1069056K)]

第一个值显示GC之前以前使用的大小,第二个值显示当前使用的大小,最后一个值显示当前保留的大小。

调整前

下面是使用所有默认值运行的实验。如您所见,有6个完整的GC事件由达到“metadatagc Threshold”触发。初始高水位线由默认的MetaspaceSize(即21807104字节)设置。因此,当所有元空间的提交内存达到初始高水位线时,将引发第一个完整的GC事件。查找热点的默认选项值

3.112: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 21013K->21013K(1069056K)]
5.440: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 34645K->34645K(1081344K)]
11.921: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 58159K->58152K(1101824K)]
18.321: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 97038K->97038K(1136640K)]
51.761: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 160475K->155432K(1193984K)]
319.406: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 267854K->267854K(1288192K)]

java元空间 主要是什么

请注意,X轴上的单位是秒,Y轴是KBytes。可以看到metaspace不够用

调整后

在这里,我们使用以下额外选项设置了实验:

-XX:MetaspaceSize=128m

请注意,128M大于默认值(即21807104字节)。由于设置的原因,我们降低了垃圾收集的频率,并且由于达到了“metadatagc Threshold”而延迟了垃圾收集。

25.863: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 127978K->126460K(1165312K)]
81.254: [Full GC (Metadata GC Threshold) ...]
   [Eden: ..., [Metaspace: 213481K->209918K(1241088K)]
3486.808: [Full GC (Allocation Failure) ...]
   [Eden: ..., [Metaspace: 306929K->298136K(1327104K)]
3631.001: [Full GC (Allocation Failure) ...]
   [Eden: ..., [Metaspace: 299979K->298792K(1329152K)]

java元空间 主要是什么

 

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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册