第235天学习打卡(知识点回顾 对OOM的认识)

知识点总结

对OOM的认识

  • *Error 递归调用,方法特别多。把栈空间撑破了

  • 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服务器配置,扩大其默认限制。

B站尚硅谷Java大厂面试题第二季(java面试必学,周阳主讲)哔哩哔哩bilibili

第235天学习打卡(知识点回顾 对OOM的认识)

上一篇:三菱 FX2N PLC 三种输出形式


下一篇:Mybatis插入数据乱码