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));
}
}
这个项目是利用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 Magic. Part 4: sun.misc.Unsafe
- Java源码剖析 sun.misc.Unsafe
- Java Magic. Part 4: sun.misc.Unsafe
- 使用sun.misc.Unsafe获取java对象地址
- Java sun.misc.Unsafe 和 CAS
- [Java 基础]sun.misc.Unsafe
- jdk源码(一):你想过用java直接操作内存吗?sun.misc.Unsafe
- Java Magic. Part 4: sun.misc.Unsafe
- Java魔法类:sun.misc.Unsafe
- 聊聊序列化(二)使用sun.misc.Unsafe绕过new机制来创建Java对象
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
- Java sun.misc.Unsafe
- Java Magic. Part 4: sun.misc.Unsafe
- 使用sun.misc.Unsafe获取java对象地址
- Java并发学习(四)-sun.misc.Unsafe
- java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值
- Java中的sun.misc.Unsafe
- Java Magic. Part 4: sun.misc.Unsafe
- 源码剖析之sun.misc.Unsafe
- how do I get the instance of sun.misc.Unsafe