一般OOM可能情况如下:

1、OutOfMemoryError: Java heap space;

2、OutOfMemoryError: PermGen space;

3、OutOfMemoryError: unable to create new native thread

4、GC overhead limit exceeded

5、java.lang.StackOverflowError

6、Direct buffer memory

一般的处理方式如下:

问题1检查代码中是否有死循环,同时可以通过设置JVM参数(Xms3062m   Xmx3062m)来进行调节处理;

问题2可以通过设置JVM参数(-XX:MaxPermSize=128m  -XXermSize=128m)来进行调节处理;

问题3产生的原因是由于我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。能创建的线程数的具体计算公式如下:
  Number of threads= (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize)

其中:MaxProcessMemory 指的是一个进程的最大内存
          JVMMemory         JVM内存
          ReservedOsMemory  保留的操作系统内存
           ThreadStackSize      线程栈的大小

在java语言里, 当你创建一个线程的时候,虚拟机会在JVM内存创建一个Thread对象同时创建一个操作系统线程,而这个系统线程的内存用的不是JVMMemory,而是系统中剩下的内存(MaxProcessMemory - JVMMemory - ReservedOsMemory)。
结合上面例子我们来对公式说明一下:
    MaxProcessMemory 在32位的 windows下是 2G
   JVMMemory   eclipse默认启动的程序内存是64M
   ReservedOsMemory  一般是130M左右
   ThreadStackSize 32位 JDK 1.6默认的stacksize 325K左右
  公式如下:(2*1024*1024-64*1024-130*1024)/325 = 5841
  公式计算所得5841,和实践5602基本一致(有偏差是因为ReservedOsMemory不能很精确) 
  我们使用的服务器是8核处理器,每核最大线程数256,所以我们线程池里总共的最大线程总数数是8*256*4=8196
由公式得出结论:你给JVM内存越多,那么你能创建的线程越少,越容易发生java.lang.OutOfMemoryError: unable to create new native thread。  
咦,有点背我们的常理,恩,让我们来验证一下,依旧使用上面的测试程序,加上下面的JVM参数,测试结果如下:

此时针对第三种情况解决方法如下:
 A)如果程序中有bug,导致创建大量不需要的线程或者线程没有及时回收,那么必须解决这个bug,修改参数是不能解决问题的;
 B)如果程序确实需要大量的线程,现有的设置不能达到要求,那么可以通过修改MaxProcessMemory,JVMMemory,ThreadStackSize这三个因素,来增加能创建的线程数:
     MaxProcessMemory 使用64位操作系统
    JVMMemory   减少JVMMemory的分配
    ThreadStackSize  减小单个线程的栈大小

问题4:JDK6新增错误类型。当GC为释放很小空间占用大量时间时会抛出此错误;问题的原因一般是因为堆太小,没有足够的内存。

解决措施如下:1、查看系统是否有使用大内存的代码或死循环;2、通过添加JVM配置,来限制使用内存<jvm-arg>-XX:-UseGCOverheadLimit</jvm-arg>

问题5:线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。

解决措施如下:1、优化程序设计,减少方法调用层次;2、调整-Xss参数增加线程栈大小

JVM OOM处理的更多相关文章

  1. Java 性能优化实战记录(3)--JVM OOM的分析和原因追查

    前言: C/C++的程序员渴望Java的自由, Java程序员期许C/C++的约束. 其实那里都是围城, 外面的人想进来, 里面的人想出去. 背景: 作为Java程序员, 除了享受垃圾回收机制带来的便 ...

  2. JVM OOM异常会导致JVM退出吗?

    出处:  https://mp.weixin.qq.com/s/8j8YTcr2qhVActLGzOqe7Q  https://blog.csdn.net/h2604396739/article/de ...

  3. spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理

    1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...

  4. jvm常用参数设置 good

    1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx= ...

  5. Spark调优之JVM调优

    一.JVM调优 JVM: 老年代: 存放少量生命周期长的对象,如连接池 年轻代: Spark task执行算子函数自己创建的大量对象 JVM机制: 对象进入java虚拟机之后会放在eden区域和一个s ...

  6. jvm常用参数设置 专题

    在jdk8中 -Xms2g不合法,能通过的:-Xms2G #!/bin/bash JAVA_OPTS="-Xms4G -Xmx4G -XX:+HeapDumpOnOutOfMemoryErr ...

  7. spark调优——JVM调优

    对于JVM调优,首先应该明确,(major)full gc/minor gc,都会导致JVM的工作线程停止工作,即stop the world. JVM调优一:降低cache操作的内存占比 1.   ...

  8. 【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因

    前言 JVM系列文章如无特殊说明,一些特性均是基于Hot Spot虚拟机和JDK1.8版本讲述. 下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到 ...

  9. spark参数调优

    摘要 1.num-executors 2.executor-memory 3.executor-cores 4.driver-memory 5.spark.default.parallelism 6. ...

随机推荐

  1. BZOJ_1613_ [Usaco2007_Jan]_Running_贝茜的晨练计划_(动态规划)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1613 n分钟,疲劳值上限是m,开始时疲劳值为0.第i分钟可以跑d[i]米.在某一时刻,如果疲劳 ...

  2. 【转】IOS 怎么获取外设的广播数据AdvData

    原文网址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/73443.aspx N ...

  3. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 总体介绍

    一.系统总体介绍 企业业务管理系统是针对经营企业管理而开发的专业管理软件, 是以“精细管理.过程监控”为设计理念,全面满足企业的信息化管理需求,充分发挥专业.平台.灵活等优点. 集进销存.财务.CRM ...

  4. 惊人事实 z

  5. 【原】Scala学习资料

    Scala是基于JVM的一种通用函数式也是面向对象编程语言,能和Java.C#等主流的编程语言无缝融合. 下面给大家推荐一些Scala的学习资料,序号靠前的重要性比较高. 1.Scala初学指南 (1 ...

  6. Html笔记(六)超链接

    超链接标签: <a> 两种用法: 一.超链接 <a href=""> 例: <a href="http://www.sina.com.cn& ...

  7. 输入n,计算并输出n1+n2+n3+……+n10

    // 方法1:双重循环 #include <stdio.h> void main() { int i,j,n,s,t; scanf("%d",&n); s=0; ...

  8. HDU4607 - Park Visit(树的直径)

    题目大意 给定一颗树,要求走过其中连续的k个点,使得步数最少 题解 每条边要么经过两次,要么一次,因为我们的目标就是使得走一次的边尽量的多,这样就转换成求树的直径了,求树的直径我用的是两次dfs,先随 ...

  9. zoj 3757 Alice and Bob and Cue Sports 模拟

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3757 #include<cstdio> #incl ...

  10. opencv数据结构-MAT结构详解

    1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...