ChronicleMap(以及更一般的堆外数据结构)实现?

时间:2014-10-01 18:01:10

标签: java concurrency compiler-construction jvm chronicle-map

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结合起来的原因并不清楚。

2 个答案:

答案 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" - 您自己管理他们的内容 - 他们不受垃圾收集器管理。