1.OutOfMemoryError

  • 抛出异常后先确定是堆溢出还是栈溢出
  1. 堆溢出:java.lang.OutOfMemoryError: Java heap space

    • 堆出现OOM(标志就是Java heap space)首先确认是内存溢出还是内存泄漏。常见的OOM就是堆溢出。
    • 内存泄漏: Memory Leak 申请到内存之后无法 释放 申请到的内存,造成这种情况的就是某个对象一直被引用这。
    • 内存溢出:Memory OverFlow :申请内存时没有足够的空间可以使用,抛出OOM。
    • 可以使用 Eclipse Memory Analyzer 或者 JProfiler(IDEA)分析内存是否泄漏
    1. -Xms 设置初始堆的大小,设置为20MB -Xms20m
    2. -Xmx设置最大堆的大小
  2. 虚拟机栈溢出和本地方法栈溢出

    1. HotSpot 虚拟机并不区分虚拟机栈和本地方法栈他两适合在一起的所以 用来设置本地方法栈大小的-Xoos并没有什么效果。
    2. -Xss 设置栈容量大小
    3. 栈可以抛出2种异常
      • StackOverflowError 线程请求的栈深度大于虚拟机所允许的最大深度。
      • OutOfMemoryError  扩展栈时无法申请到足够的内存,比较少见。
    4. 操作系统分配给每个进程的内存是有限的,如32位win给进程分配的是2G,栈内存 = 2GB - 堆Xmx - 方法区 MaxPermSize
    5. 线程越多分配的栈内存就越少,每个线程分配的栈容量就越大线程就越少,容易把剩下的内存耗尽。
    6. jvm默认情况下栈深度平均在1000-2000间(栈帧个数即方法数量),如果不能更换更高位数的操作系统也不能减少线程数量,那么可以通过减少堆的最大容量让出一部分内存来给栈,避免栈内存溢出。
  3. 方法区和运行时常量池溢出

    1. OutOfMemoryError:PermGen space 运行时常量池在方法区中他两都会抛出此异常。
    2. -XX:PermSize 方法区初始值大小
    3. -XX:MaxPermSize 方法区最大值
    4. 由于1.8 去永久带 而加入了 Metaspace 元空间 所以上面的配置 1.8 开始就不能失效了
    5. -XX:MetaspaceSize 元空间大小, -XX:MaxMetaspace元空间最大值。
  4. 本机直接内存溢出

    1. -XX: MaxDirectMemorySize 可以指定最大值,如果不指定默认和堆一样大。
    2. 由于直接内存不在堆里,它是供NIO使用的所以抛出OOM异常后通过jvm内存检测工具 在Heap Dump中没有明显错误,但是Dump文件很小就可以考虑直接内存溢出

知识点:

  1. string.intern()是一个本地方法,它只 返回字符串常量池中唯一的那个string。

            String st1 = new StringBuilder("Mi").append("bloom").toString(); // 初始字符串常量池不存在组合的Mibloom  ,但存在了Mi和bloom.
    String st2 = new StringBuilder("ja").append("va").toString();// 初始字符串常量池存在java
    System.out.println(st1.intern() == st1);// 1.6为 false,1.7为true
    System.out.println(st2.intern() == st2);//始终为false, 常量池中存在java,因此 st2.intern()返回的是常量池中的,而st2是堆中的。
    1. 只要代码中直接出现的字符串就还会被放入常量池,但是组合生成的字符串不会被放入常量池的,如常量池中有Mi和bloom,但是没有Mibloom。
    2. 如果字符串常量池中已经包含了一个等于此string对象的符号,则string.intern()返回字符串常量池中的对象。
    3. 如果字符串常量池中没有,则将string加入字符串常量池并返回字符串常量池中的对象,此加入操作在jdk1.6 和1.7 中有所不同。
      1. 1.6中首次出现的string加入字符串常量池中的是直接复制到永久代中的字符串常量池中,所以地址会发生变化。
      2. 1.7开始 首次出现的string加入字符串常量池是复制string的引用到常量池中,所以地址不会发生变化。1.7开始 字符串常量池被移到了堆中。
  2. JVM 其他配置参数
    //常见配置汇总
    //堆设置
    -Xms:初始堆大小
    -Xmx:最大堆大小
    -XX:NewSize=n:设置年轻代大小
    -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
    -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
    -XX:MaxPermSize=n:设置持久代大小
    //收集器设置
    -XX:+UseSerialGC:设置串行收集器
    -XX:+UseParallelGC:设置并行收集器
    -XX:+UseParalledlOldGC:设置并行年老代收集器
    -XX:+UseConcMarkSweepGC:设置并发收集器
    //垃圾回收统计信息
    -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -Xloggc:filename
    //并行收集器设置
    -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集//线程数.
    -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)
    //并发收集器设置
    -XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况.
    -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.

OOM异常 Java内存溢出的更多相关文章

  1. Java内存溢出异常(上)

    上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域 ...

  2. Java内存溢出异常(下)

    此篇是上一篇文章Java内存溢出异常(上)的续篇,没有看过的同学,可以先看一下上篇.本篇文章将介绍剩余的两个溢出异常:方法区和运行时常量池溢出. 方法区和运行时常量池溢出 这部分为什么会放在一起呢?在 ...

  3. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

  4. Java基础学习总结(30)——Java 内存溢出问题总结

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

  5. Java 内存溢出分析

    原文地址:Java 内存溢出分析 博客地址:http://www.moonxy.com 一.前言 Java 的 JVM 的内存一般可分为 3 个区:堆(heap).栈(stack)和方法区(metho ...

  6. 模拟Java内存溢出

    本文通过修改虚拟机启动参数,来剖析常见的java内存溢出异常(基于jdk1.8). 修改虚拟机启动参数Java堆溢出虚拟机栈溢出方法区溢出本机直接内存溢出 修改虚拟机启动参数   这里我们使用的是ID ...

  7. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...

  8. Java内存溢出详解

    转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap ...

  9. Java内存溢出的详细解决方案

    本文介绍了Java内存溢出的详细解决方案.本文总结内存溢出主要有两种情况,而JVM经常调用垃圾回收器解决内存堆不足的问题,但是有时仍会有内存不足的错误.作者分析了JVM内存区域组成及JVM设置虚拟内存 ...

随机推荐

  1. cocos2d-x环境搭建 摘自百度文库

    cocos2d-x环境搭建 引言:笔者在网上寻觅了很多资料,最终发现了这份实际可用的文档,供大家参考.源地址:http://wenku.baidu.com/view/93f7b0f1102de2bd9 ...

  2. C#的internal访问修饰符

    文章:C# 访问修饰符internal的访问范围误区释疑 internal访问修饰符限定的类,只能在本程序集中访问.

  3. linux基本操作2

    将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...

  4. 201621044079 week05-继承、多态、抽象类与接口

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 interface关键字 implements has-a;comparable co ...

  5. hibernate笔记(三)

    目标: 第1部分: 对象的状态: 第2部分:缓存 1) 一级缓存 2) 相关知识 ----懒加载--- 第3部分:映射 一对一映射 组件映射 继承映射 一.对象的状态 举例: User   user  ...

  6. BZOJ4602: [Sdoi2016]齿轮 DFS 逆元

    这道题就是一个DFS,有一篇奶牛题几乎一样.但是这道题卡精度. 这道题网上的另一篇题解是有问题的.取对数这种方法可以被轻松卡.比如1e18 与 (1e9-1)*(1e9+1)取对数根本无法保证不被卡精 ...

  7. Codeforces Round #553 F Sonya and Informatics

    题目 题目大意 给定一个长为 $n$($2 \le n \le 100$)的01串 $S$ .对 $S$ 进行 $k$($1 \le k \le 10^9$)次操作:等概率地选取两个下标 $i, j$ ...

  8. MySQL触发器写法

    触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/dele ...

  9. BZOJ2115 [Wc2011] Xor 【线性基】

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 3915  Solved: 1633 [Submit][Stat ...

  10. git 的证书重新设置,以及如何让git 记住提交的用户名和密码

    1.git 的证书的重新设置的命令是: git config --system --unset credential.helper 2.保存git的用户名和密码注意这里是全局保存 git config ...