常见的OOM
Posted 亮子zl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见的OOM相关的知识,希望对你有一定的参考价值。
生产故涨:
5.请谈谈你对OOM的认识? 思大克 哦威夫捞 挨饿
答:生产故涨 java.lang.StackOverflowError(栈溢出)错误
递归调用方法特别多把占空间给撑了
函数调用栈太深了,注意代码中是否有了循环调用方法而无法退出的情况
java.lang.OutOfMemoryError:java heap space(堆溢出)heap 细破 space 私被思
堆内存不够用了
使用Java程序从数据库中查询大量的数据时出现异常:
在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。
java.lang.OutOfMemoryError:GC overhead limit exceeded
GC回收时间过长会抛出OutOfMemroyError。过长的定义是,超过98%的时间用来作GC并且回收了不到2%的堆内存。连续多次GC都只回收了不到2%的极端情况下才会抛出。
假如不抛出GC overhead limit 错误会发生什么情况呢?
那就是GC清理的这么点内存很快会再次埴满,迫使GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC却没有任何成果。
*java.lang.OutOfMemoryError:Direct buffer memory 脉摸蕊
写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一种基于通道与缓冲区的I/O方式,
它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中回复制数据。
安内爆 亏A特
*java.lang.OutOfMemoryError:unable to create new native thread
高并发请求服务器时,以常出现如下异常:java.Lang.OutOfMemoryError:unable to create new native thread
准确的讲该native thread异常与对应的平台有关
导致原因:
1、你的应用创建了太多线程了,一个应该进程创建多个线程,超过系统承载极限。
2、你的服务器并不允许你的应用程序创建这么多线程,linux系统默认允许单个进程可 以创建的线程数是1024个,
你的应用创建超过这个数量,就会报java.lang.OutOfMemoryError:unable to create new native thread
解决办法:
1、想办法降低你应用程序创建线程数量,分析应用是否真的需要创建这么多线程,如果不是,改代码将线程数降到最低。
2、对于有的应用,确实需要创建很多线程,远超过linux系统的默认1024个线程的限制,可以通过修改linux服务器配置,扩大linux默认限制
java.lang.OutOfMemoryError:Metaspace(加载静态类,给撑暴了)
使用java -XX:+PrintFlagslintial命令查看本机的初始化参数,-xx:Metaspacesize为21810376B(大约20.8M)
Metaspace是方法区在HotSpot中的实现,它与持久代最大的区别在于: Metaspace并不在虚拟机内存中而使用本地内存
java.lang.OutOfMemoryError:PermGen space
说明是java虚拟机对永久代Perm内存不够。一般出现这种情况 ,都是程序启动需要加载大量的第三方jar包。
/* 摸滴
*1 故障现象 肯克恩特 马特飞K森
* java.util.ConcurrentModificationException 并发修改异常(错误)
*
*2 导致原因
* 并发争抢修改导致,参考我们的花名册签名情况
* 一个人正在写入,另外一个同学过来抢夺,导致数据不一致异常。并发修改异常
*
*3 解决方案
* 3.1 new Vector<>(); // 蛙k的
* 3.2 Collections.synchronizedList(new ArrayList<>());//线程安全的
* 3.3 Class CopyOnWriteArrayList<E> (写时复制)
以上是关于常见的OOM的主要内容,如果未能解决你的问题,请参考以下文章