美文网首页
直接内存溢出

直接内存溢出

作者: Richard_80ec | 来源:发表于2017-12-13 11:17 被阅读0次

    DirectMemory可以通过-XX:MaxDirectMemorySize指定,如果不指定,默认与Java堆的最大值(-Xmx指定)一样。
    NIO会使用到直接内存,你可以通过NIO来模拟,在下面的例子中,跳过NIO,直接使用UnSafe来分配直接内存。
    代码:

    public class DrectMemoryOOM {
    
        private static final int _1MB = 1024*1024;
    
        public static void main(String[] args) throws Exception{
            Field unsafeField = Unsafe.class.getDeclaredFields()[0];
            unsafeField.setAccessible(true);
            Unsafe unsafe = (Unsafe)unsafeField.get(null);
            while (true){
                unsafe.allocateMemory(_1MB);
            }
        }
    }
    

    虚拟机参数:
    -Xmx20M 最大堆内存
    -XX:MaxDirectMemorySize=10M 最大直接内存
    运行结果:

    Exception in thread "main" java.lang.OutOfMemoryError
        at sun.misc.Unsafe.allocateMemory(Native Method)
        at com.example.outofmemoryerror.DrectMemoryOOM.main(DrectMemoryOOM.java:19)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    

    DirectMemory导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见明显的异常,如果发现OOM之后Dump文件很小,而程序中又直接或间接使用了NIO,就需要考虑是不是这方面的原因了。

    相关文章

      网友评论

          本文标题:直接内存溢出

          本文链接:https://www.haomeiwen.com/subject/oskaixtx.html