OOM的三种类型:

堆OOM


/**
* -Xmx1g -XX:+PrintGCDetails -XX:MaxDirectMemorySize=100m
*
* @param args
*/
public static void main(String[] args) {
ArrayList<byte[]> arrayList = new ArrayList<>();
for (int i = 0; i < 1024; i++) {
arrayList.add(new byte[1024 * 1024 * 2]);
}
}

运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.Test.main(Test.java:15)

解决方法: 增大Xmx值 使用MAT,JProfile等工具进行代码分析与优化


直接内存OOM

 /**
* -Xmx1g -XX:+PrintGCDetails -XX:MaxDirectMemorySize=100m
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 2048; i++) {
ByteBuffer.allocateDirect(1024 * 1024*2);
System.out.println(i);
//System.gc();
}
}

运行结果: 直接内存设置为2M,超过100M时,进行回收

解决方法: 增大MaxDirectMemorySize的值


过多线程导致的OOM

 /**
* -Xmx1g -XX:+PrintGCDetails
-XX:MaxDirectMemorySize=100m
-Xss:指定栈空间大小
*
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i <1500 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}

运行结果: OOM unable to create native thread

解决方法: 减少线程数、或减少堆空间与线程空间


永久(Pern)溢出

永久区是存储类元数据的区域

/**
* -Xmx1g -XX:+PrintGCDetails
*
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 1000000000; i++) {
Integer integer = new Integer("1" + new StringBuffer(1));
System.out.println(new ArrayList<>());
}
}

运行结果: OOM Permgen sace 解决方法:

  • 增大MaxPremSize的值
  • 减少系统需要的类的数量
  • 使用ClassLoader合理装载类,并进行回收

GC效率低下引起的OOM

判断GC引起OOM的条件

  1. 花在GC上的时间是否超过了98%
  2. 老年代释放的内存是否小于2%
  3. Eden区释放的内存是否小于2%
  4. 是否连续5次GC都出现了上述几种情况

关闭OOM可以通过参数:-XX:-UseGCOverheadLimit 进行设置

String常量池因其的OOM


/**
* -Xmx5m -XX:MaxPermSize5m【JDK<1.6】
*
* @param args
*/
public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 0;
while (true) {
list.add(String.valueOf(i++).intern());
}
}

运行结果: JDK1.6 :Perm space JDK1.7 :heap space

【注】

 /**
*String.intern()方法返回字符串常量池引用,但不一定每时每刻都返回一样,可能垃圾回收后重新放入常量池
*
* @param args
*/
public static void main(String[] args) {
System.out.println(System.identityHashCode((args[0] + Integer.toString(0))));//字符本身hash
System.out.println(System.identityHashCode((args[0] + Integer.toString(0)).intern()));//常量池引用
System.gc();//未gc前常量池引用相同
System.out.println(System.identityHashCode((args[0] + Integer.toString(0)).intern()));//常量池引用
}

浅堆和深堆

浅堆(shallow heap):一个对象结构所占的内存大小,对象包括属性和对象头、对象引用等。

如String对象,其结构包括:
类型 大小
int hash32 0
int hash 0
ref value c://...

其中2个int8字节 对象引用4字节 对象头8字节 按照8字节对齐,则对象浅堆共24字节

深堆(retained heap):一个对象被GC回收后,可以真实释放的内存大小。即对象所持有的对象和包括对象自身的所有的浅堆的大小之和。

从图中可以看出对象A的浅堆大小为A本身,对象A的实际大小为对象A、对象B、对象C、对象D的浅堆大小之和,对象A的深堆大小为对象A和对象C,因为对象B和对象D同时也被对象E所引用

OOM三种类型的更多相关文章

  1. 链路层三种类型的MAC地址

    若需要转载,请注明出处. 我们知道,链路层都是以MAC地址来进行通信双方的地址标识的,如下图:在应用中根据接收方的多寡来进行划分,可分为以下三种: 单播(Unicast) 多播(Multicast) ...

  2. matlab for循环的三种类型

    学习了一半了,发现一个好网站,就是我想写这篇博客用的,网络真是个好东西!纪念下国庆啦 网址:http://www.yiibai.com/matlab/matlab_for_loop.html ---- ...

  3. C# enum、int、string三种类型互相转换

    enum.int.string三种类型之间的互转 #代码: public enum Sex { Man=, Woman= } public static void enumConvert() { in ...

  4. 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...

  5. ASP.NET 设计模式分为三种类型

    设计模式分为三种类型,共23类.  一.创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式.      二.结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代 ...

  6. 云计算服务的三种类型(SaaS、PaaS、IaaS)

    云计算可以帮助企业降低IT方面的成本和复杂性,并获得他们蓬勃发展所需的灵活性与敏捷性.但是,规划出通往云的明确路径并非易事.毕竟用户需要看透与云相关的市场大肆宣传,然后理解并分析不同种类的云计算模式的 ...

  7. Kubernetes service 三种类型/NodePort端口固定

    Kubernetes service 三种类型 • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP(VIP)• NodePort:在每个Node上分配一个端口作为外部访问入口• Load ...

  8. 留学英文论文写作Abstract三种类型

    所谓Abstract,就是对所写论文主要内容的精炼概括.Abstract是美国人的说法,英国的科技期刊喜欢称之为Summary.在英文中,有资料是这么对其定义的:Abstract is a sketc ...

  9. spring-cloud-square开发实战(三种类型全覆盖)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<五分钟搞懂spring-clou ...

随机推荐

  1. day02 python

    列表: : 在[ ]内,可以存放多个任意类型的值: 并以逗号隔开. 一般用于存放学生的爱好:课堂的周期等等... 例如: 定义一个学生列表,可存放多个学生 list(['钱垚', '李小龙', '张全 ...

  2. 记录--git命令行上传项目到github仓库

    由于公司一直使用的是的SVN,基本上都是内网,原来的git命令都快忘记了,当然也是自己太懒,平时都是直接拖到github上.今天打开idea后突然看到了原来自己写好的一个项目,就想将它上传到githu ...

  3. trycatch中return语句如何执行

    测试代码如下: package reviewTest; /** * @ClassName: ReturnTest * @Description: 测试return在trycatch中的执行 * @au ...

  4. [pytorch学习]1.pytorch ubuntu安装

    看完了Deep Learning with Python,尝试了部分Keras的demo代码. 感觉Keras虽然容易上手,能够快速搭建出一个通用的模型,但是缺乏对底层的控制. 同时,在使用了自己编译 ...

  5. 8.mysql执行语句的顺序

    mysql执行语句的顺序     一.group by + where group by 字句和where条件语句结合在一起使用,where在前,group by 在后.即先对select xx fr ...

  6. 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇

    需要结合:<百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量--笔记篇> 一起看. #!/user/bin/env python # -*- coding:utf-8 -* ...

  7. 【ACM】 hdu_1090_A+BII_201307261100

    A+B for Input-Output Practice (II)Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3276 ...

  8. Hibernate数据缓存攻略

    目录 第一章 缓存策略概述 第二章 hibernate不使用缓存的问题 第三章 一级缓存介绍 第四章 二级缓存 第五章 一二级缓存对比及总结 源代码: https://github.com/weili ...

  9. org.hibernate.PropertyValueException: not-null property references a null or transient value: model.

    今天在写一个SSH整合的项目时,首先将数据库操作部分单独分离出来,写完后使用Junit进行測试,经过測试.发现没有不论什么问题,对数据库中的内容进行增删改查没有问题,可是将他整合到SSH的项目中时,报 ...

  10. Linux下安装lvs

    lvs已经编译到linux内核中,仅仅须要安装lvs的管理软件ipvsadm就可以 1. 插入光盘.查找设备 [root@chen ~]# ls -l /dev | grep cdrom lrwxrw ...