常? OOM 异常分析

---------作者: 捡?螺的?男孩

常? OOM 异常分析

  • 堆溢出
  • 栈溢出
  • 方法区溢出
  • 本机直接内存溢出
  • GC overhead limit exceeded

一、堆溢出

Java 堆?于存储对象实例,只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么
在对象数量到达最?堆的容量限制后就会产?内存溢出异常。

原因

  • 无法在java堆中分配对象
  • 应用程序保存了无法被GC回收的对象
  • 应用程序过度使用finalizer

排查解决思路

  1. 查找关键报错信息,如java.lang.OutOfMemoryError: Java heap space。
  2. 使?内存映像分析?具(如 Eclipsc Memory Analyzer 或者 Jprofiler)对 Dump 出来的堆储存快照进?分析,分析清楚是内存泄漏还是内存溢出。
  3. 如果是内存泄漏,可进?步通过?具查看泄漏对象到 GC Roots 的引?链,修复应?程序中的内存泄漏。
  4. 如果不存在泄漏,先检查代码是否有死循环,递归等,再考虑? -Xmx 增加堆??。

二、栈溢出

关于虚拟机栈和本地?法栈,在 Java 虚拟机规范中描述了两种异常:

  • 如果线程请求的栈深度?于虚拟机所允许的深度,将抛出 StackOverflowError 异常;
  • 如果虚拟机栈可以动态扩展,当扩展时?法申请到?够的内存时会抛出 OutOfMemoryError 异常。

原因

  • 在单个线程下,栈帧太?,或者虚拟机栈容量太?,当内存?法分配的时候,虚拟机抛出StackOverflowError 异常。
  • 不断地建?线程的?式会导致内存溢出。

排查解决思路

  1. 查找关键报错信息,确定是 StackOverflowError 还是 OutOfMemoryError;
  2. 如果是 StackOverflowError,检查代码是否递归调??法等;
  3. 如果是 OutOfMemoryError,检查是否有死循环创建线程等,通过 - Xss 降低的每个线程栈??的容量。

三、?法区溢出

?法区,(?叫永久代,JDK8 后,元空间替换了永久代),?于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、?法描述等。运?时产??量的类,会填满?法区,造成溢出。

原因

  • 使? CGLib ?成了?量的代理类,导致?法区被撑爆。
  • 在 Java7 之前,频繁的错误使? String.intern ?法。
  • ?量 jsp 和动态产? jsp。
  • 应??时间运?,没有重启。

排查解决思路

  1. 检查是否永久代空间设置得过?;
  2. 检查代码是否频繁错误得使? String.intern ?法;
  3. 检查是否跟 jsp 有关;
  4. 检查是否使? CGLib ?成了?量的代理类;
  5. 重启?法,重启 JVM。

四、本机直接内存溢出

直接内存并不是虚拟机运?时数据区的?部分,也不是 Java 虚拟机规范中定义的内存区域。但是,这部分内存也被频繁地使?,?且
也可能导致 OOM。

在 JDK1.4 中新加?了 NIO(New Input/Output) 类,它可以使? native 函数库直接分配堆外内存,然后通过?个存储在 Java 堆中的
DirectByteBuffer 对象作为这块内存的引?进?操作。这样能在?些场景中显著提?性能,因为避免了在 Java 堆和 Native 堆中来回复
制数据。

原因

  • 本机直接内存的分配虽然不会受到 Java 堆??的限制,但是受到本机总内存??限制。
  • 直接内存由 -XX:MaxDirectMemorySize 指定,如果不指定,则默认与 Java 堆最?值(-Xmx 指定)?样。
  • NIO 程序中,使? ByteBuffer.allocteDirect(capability) 分配的是直接内存,可能导致直接内存溢出。

排查解决思路

  1. 检查代码是否恰当。
  2. 检查 JVM 参数 - Xmx,-XX:MaxDirectMemorySize 是否合理。

五、GC overhead limit exceeded

  • 这个是 JDK6 新加的错误类型,?般都是堆太?导致的。
  • Sun 官?对此的定义:超过 98% 的时间?来做 GC 并且回收了不到 2% 的堆内存时会抛出此异常。

解决方案

  1. 检查项?中是否有?量的死循环或有使??内存的代码,优化代码。
  2. 检查 JVM 参数 - Xmx -Xms 是否合理。
  3. dump 内存,检查是否存在内存泄露,如果没有,加?内存。

六、总结

?种常? OOM 异常:

  • java.lang.OutOfMemoryError: Java heap space
  • java.lang.OutOfMemoryError: unable to create new native thread
  • java.lang.OutOfMemoryError: Metaspace
  • java.lang.OutOfMemoryError: Direct buffer memory
  • java.lang.OutOfMemoryError: GC overhead limit exceeded


常? OOM 异常分析

原文地址:https://www.cnblogs.com/aric2016/p/12339697.html

时间: 2024-12-08 04:14:30

常? OOM 异常分析的相关文章

深入JVM——OOM异常解析

JVM对象访问解析 对象访问过程的内存情况 public void function(){ Object obj = new Object(); } function方法被执行的时候,JVM在JVM栈中为function创建一个栈帧,用于存放function在运行过程中的一些信息. Object obj被执行时,JVM在function方法对应的栈帧中的本地变量表中创建Object类型的引用obj. new Object()被执行时,JVM在堆内存中创建一块Object类型的.包含实例数据值的结

Android异常分析(转)

关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应.应用停止运行.冻屏.重启.死机等,这些异常系统有统一的异常处理机制,出现异常系统就会执行相应的操作,最终有相应的现象体现出来.另外,一些不在预料之中的界面显示问题,操作问题,运行卡顿问题等也可以归于异常,只不过这种异常是人为逻辑缺陷,对系统来说是正常的,但这些缺陷在异常现象中占比却相当大,直接体现出

深入理解Java虚拟机03:OOM异常

OOM 异常 (OutOfMemoryError) OOM 异常 (OutOfMemoryError) Java 堆溢出 Java 虚拟机栈和本地方法栈溢出 方法区和运行时常量池溢出 直接内存溢出 Java 堆溢出 出现标志:java.lang.OutOfMemoryError: Java heap space 解决方法: 先通过内存对象分析工具分析Dump出来的堆转存储快照,确认内存中的对象是否是必要的,级分清楚是出现了内存泄漏还是内存溢出: 如果是内存泄漏,通过攻击查看泄漏对象到GC Roo

OOM异常产生的原因和处理方法

一般而言,android中常见的原因主要有以下几个: 1.数据库的cursor没有关闭. 2.构造adapter没有使用缓存contentview. 3.调用registerReceiver()后未调用unregisterReceiver(). 4.未关闭InputStream/OutputStream. 5.Bitmap使用后未调用recycle(). 6.Context泄漏. 7.static关键字等. 接下来分别对这些溢出情况说出解决的思路: 1.针对数据库cursor没有关闭的情况,如果

MySQL 外键异常分析

外键约束异常现象 如下测例中,没有违反引用约束的插入失败. create database `a-b`; use `a-b`; SET FOREIGN_KEY_CHECKS=0; create table t1(c1 int primary key, c2 int) engine=innodb; create table t2(c1 int primary key, c2 int) engine=innodb; alter table t2 add foreign key(c2) referen

SylixOS 之epoll异常分析

1. SylixOS epoll介绍 SylixOS为了兼容Linux的epoll,创建了epoll的兼容子系统,并支持了epoll的部分功能.SylixOS epoll兼容子系统是由select子系统模拟出来的,所以效率没有select高. 2. epoll异常分析 2.1epoll异常场景 在使用线程A创建AF_UNIX匿名套接字发送数据:线程B把套接字加入epoll监听,且设置属性为一次有效:线程C等待epoll事件产生,并读取套接字中的数据.如程序清单 2-1所示.           

Android OOM异常解决方案

一,什么是OOM异常: OOM(out of Memory)即内存溢出异常,也就是说内存占有量超过了VM所分配的最大,导致应用程序异常终止: 二,为什么会产生OOM异常呢? OOM异常是Android中经常遇到的一个问题,程序员稍微不注意可能就导致其产生.通常OOM都发生在需要用到大量内存的情况下,因为Android的每一个应用都是一个Davlik虚拟机,该虚拟机的默认堆内存只有16M,远远无法跟我们的PC机比较,因此和容易导致OOM(Out Of Memory)异常的产生.导致这样的异常主要有

Java ConcurrentModificationException 异常分析与解决方案

Java ConcurrentModificationException 异常分析与解决方案http://www.2cto.com/kf/201403/286536.html java.util.ConcurrentModificationException 解决办法 http://blog.csdn.net/lipei1220/article/details/9028669 原因:Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterato

java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12:54 8004人阅读 评论(6) 收藏 举报 socket服务器bufferstring网络java 第 1个异常是java.net.BindException:Address already in use: JVM_Bind.该异常发生在服务器端进行new ServerSocket(port)(p