11

java元空间 主要是什么

 3 years ago
source link: http://javakk.com/859.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

正如您在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)]

y2Un2m7.png!mobile

请注意,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)]

36R3MnJ.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK