内存溢出错误OOM总结

  • 2020 年 08 月 01 日
  • 106次
  • 575 字
  • 暂无评论

  1. Java.lang.StackOverflowError

    • 栈空间溢出
  2. Java.lang.OutOfMemoryError:Java heap space

    • 堆内存溢出
  3. Java.lang.OutOfMemeoryError:GC overhead limit exceeded

    • GC回收时间过长就会抛出该错误。
    • 程序在垃圾回收上花费了98%的时间,却收集不回2%的空间,通常这样的异常伴随着CPU的冲高。
  4. Java.lang.OutOfMemeoryError:Direct buffer memory

    • 写NIO程序经常使用ByteBuffer来读取或写入数据,这是一种基于通道(Channel)与缓冲区(Buffer)的I/O方式。它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆内的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据的开销。
    1. ByteBuffer.allocate(capavility):这种方式是分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢。
    2. ByteBuffer.allocteDirect(capability):这种方式是分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。
- 但是如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象就不会被回收,此时本地内存可能已经用尽,再次尝试分配本地内存就会出现改错误。
- 复现该问题的示例代码:
//配置参数
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
//Java代码
public static void main(String[] args){
    System.out.println("配置的MaxDirectMomery:" + (sun.misc.VM.maxDirectMemory() / (double) 1024 / 1024) + "MB" );
    try{
        Thread.sleep(3000);
    }catch(InterruptedException e){
        e.printStackTrance();
    }
    //-XX:MaxDirectMemorySize=5m 估计使坏
    ByteBuffer bb = ByteBuffer.allocateDirect(6 * 1024 * 1024);
}
  1. Java.lang.OutOfMemeoryError:unable to create new native thread

    • 导致的原因有:

      1. 应用创建了太多线程,超过系统承载极限。
      2. 服务器并不允许应用创建这么多线程,linux系统默认允许耽搁进程可以创建的线程数是1024个。
    • 解决办法:

      1. 想办法降低应用创建的线程数量,分析应用是否真的需要创建这么多的线程。
      2. 对于确实需要创建很多线程的应用,可以修改linux服务器的进程默认最大线程数限制。
      # 修改默认线程数的配置
      vim /etc/security/limits.d/90-nproc.conf

111.png

  1. Java.lang.OutOfMemeoryError:Metaspace

    • Metespace是方法区在Hotspot中的实现。
    • 它与永久带最大的区别在于:Metaspace并不在虚拟机内存中,而是使用本地内存。
    • 永久带(JDK1.8后被元空间Metaspace取代)存放以下信息:

      • 虚拟机加载的类信息
      • 常量池
      • 静态变量
      • 即使编译后的代码
    • 如要模拟元空间溢出,就需要不断的生成类存放在元空间中。使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:MetaspaceSize为21810376B(约20M)

版权属于:东窗凝残月

本文链接:https://blog.jsiqi.com/index.php/Java/124.html

欢迎学习交流,转载请保留作者信息以及原文链接,文章注明不可转载的除外。



—— 暂无评论 ——

OωO