常见OOM问题之metaspace space元空间OOM问题详解

本文来自于HeapDump性能社区! !有性能问题,上HeapDump性能社区!
正文:

Java 应用程序只能使用有限的内存量。您的特定应用程序可以使用的确切内存量是在应用程序启动期间指定的。为了让事情变得更复杂,Java 内存被分成不同的区域,如下图所示:


1.png

所有这些区域的大小,包括元空间区域,都可以在 JVM 启动期间指定。如果您不自己确定大小,将使用特定于平台的默认值。

所述java.lang.OutOfMemoryError:元空间中消息指示所述元空间区域在存储器中被耗尽。

1,是什么原因造成的?

如果您不是 Java 领域的新手,您可能熟悉 Java 内存管理中的另一个概念,称为 PermGen。从 Java 8 开始,Java 中的内存模型发生了重大变化。引入了一个名为 Metaspace 的新内存区域,并删除了 Permgen。做出此更改的原因有多种,包括但不限于:

  • permgen 所需的大小很难预测。它导致供应不足触发java.lang.OutOfMemoryError: Permgen size错误或过度供应导致资源浪费。
  • GC 性能改进,启用并发类数据取消分配,无需GC 暂停和元数据上的特定迭代器
  • 支持进一步优化,例如G1并发类卸载。

因此,如果您熟悉 PermGen,那么您需要了解的背景知识就是 – Java 8 之前 PermGen 中的任何内容(类的名称和字段、类的方法以及方法的字节码、常量池、JIT 优化等) ) – 现在位于元空间。

如您所见,元空间大小要求取决于加载的类的数量以及此类声明的大小。所以很容易看到的主要原因java.lang.OutOfMemoryError:元空间是:太多的级别或过大的类加载到元空间。**

2,举个例子

正如我们在前一章中解释的那样,元空间的使用与加载到 JVM 中的类的数量密切相关。下面的代码是最直接的例子:

public class Metaspace {
    static javassist.ClassPool cp = javassist.ClassPool.getDefault();

    public static void main(String[] args) throws Exception{
        for (int i = 0; ; i++) { 
            Class c = cp.makeClass("eu.plumbr.demo.Generated" + i).toClass();
        }
    }
}

在这个例子中,源代码遍历一个循环并在运行时生成类。所有这些生成的类定义最终都会消耗 Metaspace。类生成的复杂性由javassist库处理。

代码将不断生成新类并将它们的定义加载到 Metaspace,直到空间被完全利用并且java.lang.OutOfMemoryError: Metaspace被抛出。当使用-XX:MaxMetaspaceSize=64m启动时,在 Mac OS X 上,我的 Java 1.8.0_05 在加载了大约 70,000 个类时死亡。

3,解决办法是什么?

面对由于 Metaspace 导致的 OutOfMemoryError 时,第一个解决方案应该是显而易见的。如果应用程序耗尽了内存中的 Metaspace 区域,您应该增加 Metaspace 的大小。更改您的应用程序启动配置并增加以下内容:

-XX:MaxMetaspaceSize=512m

上面的配置示例告诉 JVM,允许 Metaspace 增长到 512 MB,然后才能开始以OutOfMemoryError的形式抱怨。

乍一看,另一种解决方案甚至更简单。您可以通过删除此参数来完全取消对元空间大小的限制。但请注意,这样做可能会引入大量交换和/或导致本机分配失败。

不过,在结束之前,请注意 - 通常情况下,通过使用上述推荐的“快速修复”,您最终会通过隐藏java.lang.OutOfMemoryError: Metaspace而没有解决潜在问题来掩盖症状。如果您的应用程序泄漏内存或只是将一些不合理的内容加载到 Metaspace 中,上述解决方案实际上不会改善任何事情,只会推迟问题。

Java OOM系列专题:

第一篇:Java OOM 原理篇 : 什么是 Java OOM

第二篇:Java OOM 基础篇:常见的OutOfMemoryError 场景一:Java heap space 堆溢出问题详解

第三篇:Java OOM 基础篇:常见的OutOfMemoryError 场景二 : GC overhead limit exceeded 问题详解

第四篇:Java OOM 基础篇:常见的OutOfMemoryError 场景三: PermGen space 永久空间问题详解

第五篇:Java OOM 基础篇:常见的OutOfMemoryError 场景四: Permgen size 元空间问题详解

第六篇:Java OOM 实战篇:应用故障之Java heap space 堆溢出实战

第七篇:Java OOM 高级篇:体验了一把线上CPU100%及应用OOM的排查和解决过程

第八篇:Java OOM 高级篇:线上Docker 上Springboot程序OOM问题的排查分享

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容