您的位置:首页 > Web前端

Java中的sun.misc.Unsafe包

2014-05-08 15:41 381 查看
chronicle项目:https://github.com/peter-lawrey/Java-Chronicle

这个项目是利用mmap机制来实现高效的读写数据,号称每秒写入5到20百万条数据。

作者有个测试,写入1百万条log用时0.234秒,用java自带的logger,用时7.347秒。

在看chronicle的源代码,发现一个牛B的利用Unsafe来直接读写内存,从而提高效率的例子。

详细见这个类:https://github.com/peter-lawrey/Java-Chronicle/blob/master/src/main/java/vanilla/java/chronicle/impl/UnsafeExcerpt.java

Unsafe包的参考:http://www.docjar.com/docs/api/sun/misc/Unsafe.html

下面这个例子演示了简单的修改一个byte[]的数据。

这个例子在eclipse里不能直接编译,要到项目的属性,Java Compiler,Errors/Warnings中Forbidden reference(access rules)中设置为warning。

另外,因为sun.misc.Unsafe包不能直接使用,所有代码里用反射的技巧得到了一个Unsafe的实例。

[java] view
plaincopy

import java.lang.reflect.Field;  

import java.util.Arrays;  

import sun.misc.Unsafe;  

  

public class Test {  

    private static int byteArrayBaseOffset;  

  

    public static void main(String[] args) throws SecurityException,  

            NoSuchFieldException, IllegalArgumentException,  

            IllegalAccessException {  

        Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");  

        theUnsafe.setAccessible(true);  

        Unsafe UNSAFE = (Unsafe) theUnsafe.get(null);  

        System.out.println(UNSAFE);  

  

        byte[] data = new byte[10];  

        System.out.println(Arrays.toString(data));  

        byteArrayBaseOffset = UNSAFE.arrayBaseOffset(byte[].class);  

  

        System.out.println(byteArrayBaseOffset);  

        UNSAFE.putByte(data, byteArrayBaseOffset, (byte) 1);  

        UNSAFE.putByte(data, byteArrayBaseOffset + 5, (byte) 5);  

        System.out.println(Arrays.toString(data));  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源代码 内存