JVM那点事-内存溢出如何处理(2)

哈喽,大家好,本期这一系列,咱们聊一下发生OOM咱们应该怎么处理。

1. Java堆溢出

Java堆用于存储对象实例,只要不断创建对象,并且保证GC Roots对象之间有可达路径避免垃圾回收机制消除这些对象,那么对象数量到达最大堆容量限制后就会产生内存溢出异常。
要解决这个问题,一般的手段是先通过内存影像分析工具JVM那点事-内存溢出如何处理(1)——MAT工具的下载使用对Dump出来的堆转储快照进行分析。重点是确定内存对象是否是有必要的。也就是要先分清楚到底是出现了内存泄露(Memory Leak)还是内存溢出(Memory Overflow)。

如果是内存泄露,可以进一步查看泄露对象到GCRoots的引用链,于是就能找到泄露对象通过怎么样的路径(也就是dominator ['dɒmɪneɪtə] 支配者)与GC相关联并导致GC无法自动回收它们

如果不存在泄露,换句话说。就是内存中的对象确实都还必须存活着,那么就需要检查JVM的堆参数(-XMx-XMs)与物理内存对比是否还可以调大。从代码检查角度,判断是否存在某些对象声明周期过长,持有状态时间过长,应尝试减少程序运行期的内存消耗

2. 虚拟机栈和本地方法栈溢出

栈容量只由-Xss参数设置。关于虚拟机栈和本地方法栈,java虚拟机描述了两种异常:

  • 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError ([fləʊ] 流动)。
  • 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError

操作系统分配给每个进程的内存是有限的(JVM是一个进程)虚拟机提供了参数来控制Java堆(-Xmx)和方法区(MaxPermSize [pɜ:m]电卷发)内存的最大值,程序计数器销毁内存很小,可以忽略掉。剩下的内存就由虚拟机栈本地方法栈瓜分。
若是建立多线程导致的内存溢出,在不减少线程数的情况下,可以通过减少最大堆和减少栈容量来换取更多的线程。

3. 方法区和运行时常量池溢出

我们可以通过-XX:PermSize-XX:MaxPermSize限制方法区的大小。方法区存放Class相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。现在很多主流框架,如SpringHibernate,在对类进行增强时,都会使用CGLib这类字节码技术,增强的类越多,需要越大的方法区保证动态生成的Class可以加载入内存。可能会导致方法区内存溢出。

4. 本机直接内存溢出

JVM那点事-JVM内存结构可以了解一下堆外内存。这里简单介绍下:(直接内存大多情况下被称为堆外内存,自从java引入NIO之后,堆外内存使用越来越普遍,通过native方法可以分配堆外内存,通过DirectByteBuffer对象来操纵)。
DirectMemory容量可以通过 -XX:MaxDirectMemorySize 参数来设置最大可用直接内存,如果启动时未设置则默认为最大堆内存大小,即与 -Xmx 相同。即假如最大堆内存为1G,则默认直接内存也为1G,那么 JVM 最大需要的内存大小为2G多一些。当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError

若是发生直接内存溢出的情况,解决方案可以扩大堆外内存或者禁止netty使用堆外内存,转用堆内内存。
扩大堆外内存:
-XX:MaxDirectMemorySize=1024m
禁用堆外内存:
-Dio.netty.noPreferDirect=true \
-Dio.netty.leakDetectionLevel=advanced \
这里的操作要看服务器的内存大小,内存足够大,直接扩大堆外内存即可。

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

推荐阅读更多精彩内容

  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,424评论 3 83
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 694评论 0 1
  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 88,760评论 17 311
  • 文章转自 http://blog.csdn.net/u012152619/article/details/4696...
    云狗狗狗狗狗阅读 577评论 1 4
  • 这只小猫原来是一只野猫,哎,后来我们家的爷爷奶奶把他抓回来了,他在我们家过得很幸福。 他在我家现...
    生死犹天定阅读 204评论 0 0