zoukankan      html  css  js  c++  java
  • Java中的sun.misc.Unsafe包

    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的实例。

    1. import java.lang.reflect.Field;  
    2. import java.util.Arrays;  
    3. import sun.misc.Unsafe;  
    4.   
    5. public class Test {  
    6.     private static int byteArrayBaseOffset;  
    7.   
    8.     public static void main(String[] args) throws SecurityException,  
    9.             NoSuchFieldException, IllegalArgumentException,  
    10.             IllegalAccessException {  
    11.         Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");  
    12.         theUnsafe.setAccessible(true);  
    13.         Unsafe UNSAFE = (Unsafe) theUnsafe.get(null);  
    14.         System.out.println(UNSAFE);  
    15.   
    16.         byte[] data = new byte[10];  
    17.         System.out.println(Arrays.toString(data));  
    18.         byteArrayBaseOffset = UNSAFE.arrayBaseOffset(byte[].class);  
    19.   
    20.         System.out.println(byteArrayBaseOffset);  
    21.         UNSAFE.putByte(data, byteArrayBaseOffset, (byte1);  
    22.         UNSAFE.putByte(data, byteArrayBaseOffset + 5, (byte5);  
    23.         System.out.println(Arrays.toString(data));  
    24.     }  
    25. }  
  • 相关阅读:
    Windows Phone 7 电话本相关的操作
    Windows CE 下判断 URL 地址是否有效
    cigarettes
    开灯问题
    日期计算
    小学生算术
    另一种阶乘问题
    鸡兔同笼
    笨小熊
    6174问题
  • 原文地址:https://www.cnblogs.com/jym-sunshine/p/5134332.html
Copyright © 2011-2022 走看看