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

[java]  view plain copy
  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. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM