本机直接内存溢出
来源:互联网 发布:scratch2.0趣味编程 编辑:程序博客网 时间:2024/06/05 19:49
DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xmx指定)一
样。代码清单2-9越过了DirectByteBuffer类,直接通过反射获取Unsafe实例并进行内存分配(Unsafe类的getUnsafe()
方法限制了只有引导类加载器才会返回实例,也就是设计者希望只有rt.jar中的类才能使用Unsafe的功能)。因为,虽
然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是
通过计算得知内存无法分配,于是手动抛出异常,真正申请分配内存的方法是unsafe.allocateMemory()。
代码清单2-9 使用unsafe分配本机内存
package com.npf.test;import java.lang.reflect.Field;import sun.misc.Unsafe;/** * VM Args:-Xmx20M -XX:MaxDirectMemorySize=10M * @author Jack */public class DirectMemoryOOM { 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); }}}
由DirectMemory导致的内存溢出,一个明显的特征是在Heap Dump文件中不会看见明显的异常。如果读者发现OOM
之后Dump文件很小,而程序中又直接或间接使用了NIO,那就可以考虑检查一下是不是这方面的原因。
参考文献:
1. 第2章 Java内存区域与内存溢出异常
0 0
- 本机直接内存溢出
- 本机直接内存溢出
- 本机直接内存溢出
- jvm_内存溢出_本机直接内存溢出
- 方法区溢出+直接内存溢出
- 【JVM】5_测试直接内存溢出
- 写代码实现堆溢出、栈溢出、永久代溢出、直接内存溢出
- 写代码实现堆溢出、栈溢出、永久代溢出、直接内存溢出
- Tomcat直接启动正常,通过myeclipse启动tomcat内存溢出
- Tomcat直接启动正常,通过myeclipse启动tomcat内存溢出
- html中的内存溢出,页面直接无响应
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 扫雷游戏的C语言实现
- 重启nginx时出现的问题
- msyql 简单的sql优化
- hdu1151——Air Raid(最小路径覆盖)
- 【位运算】求两个数的二进制有多少位不同
- 本机直接内存溢出
- 图解HTTP读书笔记(一)
- 卷积神经网络
- 图解HTTP读书笔记(二)
- oracle11g awr报告设置
- java web学生表的增加、修改、删除
- 一个长度为2N的数组,前面N个是数字,后面N个是字母,类似123abc,让转化为1a2b3c
- 找不到javac
- 图解HTTP读书笔记(三)