Java中另类使用内存的方法

本文介绍了Java中的sun.misc.Unsafe类,用于在特殊场景下进行内存分配、释放和高效访问。讨论了其在OpenHFT中的应用,包括如何分配堆内存、访问原始内存、线程安全地访问内存以及进行CAS操作。Unsafe提供了低延迟的内存访问和进程间共享内存的能力,但在常规编程中应谨慎使用。
摘要由CSDN通过智能技术生成

sun.misc.Unsafe为你大开Java的方便之门,你可以用它做很多Java不允许的事情,在一些非常特殊的场景下它还是非常有用的。99%的时候,你都应该避免使用它,然而在有些非常罕见的情况下,只有它能解决问题。

本文讲述了它在OpenHFT中的使用场景以及我希望在Java 9中看到哪些功能。如果希望访问大量内存的同时又不影响GC,就特别适合使用Unsafe。在进程间共享内存,同时又不希望引起显著的开销,在Java中就只有这么一种方法了。

分配及释放堆内存
public native long allocateMemory();
public native void freeMemory(long address);
你可以用这两个方法分配任何大小的堆内存。它不受Integer.MAX_VALUE字节的大小限制,返回给你的是原始内存,需要的话你可以进行边界检查。比如,Bytes.writeUTF(String)会计算编码的字符串的长度,检查是否容纳的下整个字符串,当然只做一次校验,不会每个字节都检查一遍。
java.lang里面也有一个类似的Cleaner类,DirectByteBuffer就用它来确保内存已经被释放了。不过这个类不太应该放到这么核心的地方。

访问原始内存
public native Xxx getXxx(Object, long offset); // intrinsic
public native void putXxx(Object, long offset);// intrinsic
在这两组方法中,当访问的是堆外的内存时,Object是为空的,offset就是实际的地址。在把它们当作内部函数的JVM上,你可以只用一条机器指令就可以访问原始内存。这极大的提高了内存访问的效率。 这种访问方式的问题就是,你得自己去维护你数据结构里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值