有几种计算机编程语言使用JVM字节码作为其解释器/编译器的目标语言。对我来说,许多新的编程语言(不到15年)都在JVM上运行,我想知道是否所有这些编程语言都禁止了显式内存释放:
是否可以通过任何指令显式分配-释放字节码中的内存?相反,垃圾回收器总是负责内存释放吗?
有几种计算机编程语言使用JVM字节码作为其解释器/编译器的目标语言。对我来说,许多新的编程语言(不到15年)都在JVM上运行,我想知道是否所有这些编程语言都禁止了显式内存释放:
是否可以通过任何指令显式分配-释放字节码中的内存?相反,垃圾回收器总是负责内存释放吗?
JVM抽象了所有的内存管理。没有用于内存释放的字节码,就像没有用于内存分配或直接内存访问的字节码一样。如果您想要这样做,必须使用本地代码,直接或间接地。
两年后,当我发现Apache Spark中的Tungsten项目使用JVM来分配和释放堆内存时,我回到了这个问题。
这不是新鲜事,所以它是可行的。你可以在这里找到更多细节,我得到了以下示例:
public DirectIntArray(long size) {
startIndex = unsafe.allocateMemory(size * INT_SIZE_IN_BYTES);
unsafe.setMemory(startIndex, size * INT_SIZE_IN_BYTES, (byte) 0);
}
}
public void setValue(long index, int value) {
unsafe.putInt(index(index), value);
}
public int getValue(long index) {
return unsafe.getInt(index(index));
}
private long index(long offset) {
return startIndex + offset * INT_SIZE_IN_BYTES;
}
public void destroy() {
unsafe.freeMemory(startIndex);
}