正如您在java8 permgen中看到的,PermGen空间已经停止使用。在JDK 8中,类元数据现在存储在本机堆中,这个空间称为元空间。
PermSize
和MaxPermSize
JVM参数将被忽略,如果在启动时出现,则会发出警告。
元空间内存分配模型
类元数据的大多数分配现在都是从本机内存中分配的。
用于描述类元数据的klasse已被删除。
超空间容量
默认情况下,类元数据分配受可用本机内存量的限制(容量当然取决于是否使用32位JVM而不是64位以及操作系统虚拟内存可用性)。
有一个新的标志可用(MaxMetaspaceSize),允许您限制用于类元数据的本机内存量。如果不指定此标志,元空间将根据运行时的应用程序需求动态调整大小。
元空间垃圾回收
一旦类元数据使用量达到“MaxMetaspaceSize”,就会触发对死类和类加载器的垃圾回收。
显然需要对元空间进行适当的监视和调优,以限制此类垃圾收集的频率或延迟。过多的元空间垃圾收集可能是类、类加载器内存泄漏或应用程序大小不足的症状。
Java堆空间影响
一些杂项数据已移动到Java堆空间。这意味着您可能会在未来的jdk8升级后观察到Java堆空间的增加。
元空间监测
Metaspace用法可从HotSpot 1.8详细GC日志输出中获得。
根据我们对b75的测试,Jstat和JVisualVM还没有更新,旧的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)]
请注意,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)]
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/859.html
暂无评论