先来了解一下数组对象在堆中的存储形式【数组长度,数组元素类型信息等】+ 【存放元素对象的空间】
Ma
| 基础信息 | 实例数据 | 内存填充 | |
| Mark Word,ClassPointer,数组长度 | 第一个元素 | 第二个元素 | 固定的填充内容 |
所以我们想要获取某个下标的元素首先要获取这个元素的起始位置和每个元素长度
例如我们要取第二个元素的,首先知道第二个元素的起始位置,从其实位置开始按照每个元素的长度取指定的位数,就相当于获取了第二个元素的全部信息。
再来了解一下Java中一个特殊的类sun.misc.Unsafe
sun.misc.Unsafe是JDK提供的用于很底层编程的类,位于sun.misc包中。在有些底层编程的场景,Java语言层面办不到的事情,我们可能需要使用JNI,借助C语言去实现。但是使用JNI并不是唯一的选择,使用JNI会将代码绑定到特定的平台,使用Unsafe类可以保留Java语言代码对平台的独立性,又实现底层编程。
Unsafe类并没有public的构造函数,只提供了一个静态工厂方法,这个静态方法还只提供给JDK标准库自身的类调用,在我们自己随便建的一个普通的类调用这个静态工厂方法还会抛异常。
这个静态工厂方法的代码如下:
@CallerSensitive
public static Unsafe getUnsafe() {
Class<?> caller = Reflection.getCallerClass();
if (!VM.isSystemDomainLoader(caller.getClassLoader()))
throw new SecurityException("Unsafe");
return theUnsafe;
}
可以使用反射的方式
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class TestUnsafe {
private static Unsafe unsafe;
static {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe) f.get(null);
} catch (Exception e) {
//
}
}
}
Unsafe功能列表
- allocateMemory/freeMemory,分配、释放堆外内存Dire


4066

被折叠的 条评论
为什么被折叠?



