桂林北京网站建设,门户网站建设发展趋势,中国十大广告公司排名,logo免费网站一、什么是直接内存
直接内存不是虚拟机运行时数据区的一部分#xff0c;是在运行时数据区外、直接向系统申请的内存空间。
通常#xff0c;访问直接内存的速度会优于堆#xff0c;读写性能更好。因此#xff0c;出于性能考虑#xff0c;读写频繁的场合可能会考虑使用直…一、什么是直接内存
直接内存不是虚拟机运行时数据区的一部分是在运行时数据区外、直接向系统申请的内存空间。
通常访问直接内存的速度会优于堆读写性能更好。因此出于性能考虑读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存用于数据缓冲区。 普通IO写需要从用户缓存空间copy到内核缓存空间再copy到磁盘读就是反过来而NIO是直接与磁盘进行交互因此速率更快适合对大文件的读写操作。 二、直接内存的简单使用
1. 使用ByteBuffer.allocateDirect()方法 public static void main(String[] args) {//申请直接内存ByteBuffer byteBuffer ByteBuffer.allocateDirect(1024*1024*1024);System.out.println(内存分配完毕);Scanner scanner new Scanner(System.in);scanner.next();System.out.println(直接内存开始释放);byteBuffer null;System.gc();scanner.next();}2. 使用Unsafe对象的allocateMemory()方法
ByteBuffer.allocateDirect()方法内部也是通过Unsafe对象的allocateMemory()方法来分配内存的。 public static void unSafeTest() throws IllegalAccessException {//无法使用其内部通过判别当前类加载器限制了这个方法的调用
// Unsafe unsafe Unsafe.getUnsafe();//通过反射构造unsafe对象Field unsafeField Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe (Unsafe)unsafeField.get(null);int count 0;while (true) {unsafe.allocateMemory(1024*1024*1024);System.out.println(count);}}三、直接内存的大小设置与内存溢出
直接内存可通过MaxDirectMemorySize设置如果不指定则默认与堆的-Xmx参数值一致。
使用时若超出最大内存则会抛出OutOfMemoryError。
四、直接内存的回收
直接内存不受JVM内存管理分配和回收成本较高。
直接内存不受gc控制是通过虚引用和引用计数判断gc时若发现无引用则通知系统直接内存可以垃圾回收了然后这里具体垃圾回收由操作系统来处理。