ChronicleMap在他们的文档中的OpenHFT的repository on Github状态:
Chronicle Map implements the java.util.concurrent.ConcurrentMap, that stores
its data off the java heap.
我已经构建了一个编译器,并为一些off-shoot语言的编译器实现做出了贡献。我曾经使用的那个人在堆栈上分配所有内容(这是代码生成期间可用的内容)。我从未参与过JVM和java编译器,但我知道通常只有堆和堆可用于分配类,局部变量,函数参数等实例。
有人可以解释一下我们是如何编写代码的,我们可以告诉编译器实例化ChronicalMap等数据结构,让它们可以通过JVM进行垃圾收集(并跟踪JVM的跟踪)一般内存管理功能),但生活在堆?
我已经阅读了simple construction documentation and the associate example。我看到了how
但是与JVM结合起来的原因并不清楚。
答案 0 :(得分:3)
要记住的一件重要事情是javac
编译器在优化方面没有做太多工作,也没有为您提供任何指定数据存储位置或代码优化方式的方法。 (在Java 8中有一些模糊的例外,比如@Contended)
Java从通常在运行时运行的库中获取了大部分可扩展性。 (通常还有构建时选项)要实现的一个关键事项是Java程序可以在代码运行时生成和更改代码,因此实际上很多智能都是在运行时发生的。
在堆外使用的情况下,您需要一个支持此功能的库,这将直接或间接使用sun.misc.Unsafe
(在大多数流行的JVM上)此类允许您执行语言所做的许多事情。 #39; t支持,但如果您是低级库构建器,则仍然非常有用。
虽然GC不直接管理关闭堆内存,但您可以拥有代理对象,例如ByteBuffer
Cleaner
{{1}},当这些对象被GC编辑时,与之关联的关闭堆内存也会被清除。
免责声明,我写了大部分ChronicleMap。
答案 1 :(得分:1)
术语off heap是指使用" raw" java中的内存缓冲区。这些可能来自进程地址空间或内存映射文件的常规内存缓冲区。
这些缓冲区是" raw" - 您自己管理他们的内容 - 他们不受垃圾收集器管理。