第235天学习打卡(知识点回顾 对OOM的认识)
Posted doudoutj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第235天学习打卡(知识点回顾 对OOM的认识)相关的知识,希望对你有一定的参考价值。
知识点总结
对OOM的认识
- stackOverflowError 递归调用,方法特别多。把栈空间撑破了
- OutOfMemoryError: java heap space: 对象太多把堆撑破了
- OutOfMemoryError:GC overhead limit exceeded :GC回收时间过长时会抛出OutOfMemoryError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存。连续多次GC都只回收了不到2%的极端情况下才会抛出。假如不抛出GC overhead limit错误 会发生什么情况呢? 那就是GC清理的这么点内存很快会再次填满,迫使GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC却没有任何成果。
- OutOfMemoryError:Direct buffer memory: 写NIO程序经常使用ByteBuffer来读取或者写入数据,这是一种基于通道(Channel)与缓存区(Buffer)的I/O方式。它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。ByteBuffer.allocte(capability)第一种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所有速度相对较慢。ByteBuffer.allocteDirect(capability)第一种方式是分配本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象们就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那么程序就直接崩溃了
- OutOfMemory:unable to create new native thread :高并发请求服务器是,经常出现这个异常。准确的讲该native thread异常与对应的平台有关。
- 导致原因:
- 创建了太多的线程,一个应用程序创建多个线程,超过系统承载极限
- 服务器并不允许你的应用程序创建这么多线程,linux系统默认允许单个进程可以创建的线程是1024个,超过了这个数量就会报异常。
- 解决办法:
- 降低应用程序创建线程的数量,分析应用是否真的需要创建这么多线程,如果不是,将线程数降到最低
- 对于有的应用,确实需要创建很多线程,远超过linux系统运行的限制,可以修改Linux服务器配置,扩大其默认限制。
- 导致原因:
以上是关于第235天学习打卡(知识点回顾 对OOM的认识)的主要内容,如果未能解决你的问题,请参考以下文章
第281天学习打卡(知识点回顾, springboot 断言)