一般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. MS dos版本

    1981年,MS-DOS 1.0发行,作为IBM PC的操作系统进行捆绑发售,支持16k内存及160k的5寸软盘.在硬件昂贵,操作系统基本属于送硬件奉送的年代,谁也没能想到,微软公司竟会从这个不起眼的 ...

  2. -_-#【Cookie】缩小 Cookie

    Reduce Cookie Size Cookie 是个很有趣的话题.根据 RFC 2109 的描述,每个客户端最多保持 300 个 Cookie,针对每个域名最多 20 个 Cookie (实际上多 ...

  3. apache开源项目--gora

    Gora 是一个应用于 NoSQL 数据库的 ORM 框架,支持包括:Apache HBase/Apache Cassandra

  4. SharePoint2010主题和样式揭秘

    转:http://www.cnblogs.com/Ryu666/archive/2011/07/28/2119652.html 好久好久没写技术博客了,差点以为技术已经离我远去.但鱼离不开水,我怎能把 ...

  5. Microsoft SQL Server,错误:2;SQL Server配置管理器(本地)—远程过程调用失败

    本机是先安装sqlserver2008,后安装vs2012 在安装sqlserver2008后,运行sqlserver2008正常,接着安装vs2012,再运行sqlserver2008,问题出现了, ...

  6. 【HTML】Advanced2:Conditional Comments

    1.try and figure out what is sensible for you to support. Are your web site visitors likely to be us ...

  7. 华为过滤字符串(java)

    /*通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”.要求实现函 ...

  8. 洛谷P1220 关路灯

    洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...

  9. HW1.6

    public class Solution { public static void main(String[] args) { System.out.println("1 + 2 + 3 ...

  10. POJ1423 - Big Number(Stirling公式)

    题目大意 求N!有多少位 题解 用公式直接秒杀... 代码: #include<iostream> #include<cmath> using namespace std; # ...