常见的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的主要内容,如果未能解决你的问题,请参考以下文章

JVM性能优化服务发生OOM故障定位方案

JVM技术专题服务发生OOM故障定位方案「实战篇」

Java程序员必备:常见OOM异常分析

10种常见OOM分析——手把手教你写bug

10种常见OOM分析——手把手教你写bug

java - 各类OOM分析