问候所有人,

我想通过内存映射文件实现Java对象的透明持久性(使用OS PAPGING/交换机制)。

我的问题是:如何将Java对象移至内存映射块?另外,如何强制一个新的对象实例居住在这样的块中?

众所周知,可以将内存映射的块视为字节数组,我在这里真正问的是如何将Java对象的地址空间与此类数组之一重叠?因此,在操作系统透明地处理持久性时,我们仍然可以通过对象操纵数据(写入肮脏的页面)。

如果Java不允许我这样做,您会建议我使用什么跨平台和垃圾收集的OO语言?

谢谢大家。

有帮助吗?

解决方案

您可以做到这一点的唯一方法是使用自己的Java VM并添加此功能。当然,您要编写的代码不会在Java中,而是在VM中实现的语言中。相当一段时间以前,Gemstone将此方法用于其对象数据库引擎。

今天的对象数据库(我在一个工作中工作。)不要这样做。增强字节码以跟踪字段访问并使用反射或注入的方法将对象变成某种序列化形式是更简单的。这表现很好。如果您想支持查询,则必须使用单个现场值来索引它们。

对我们来说,维护我们想要运行的所有平台的VM是不可能的。我们也无法说服认真的客户将其整个(银行)应用程序依靠我们定制的VM。

如果您对基于Java VM的解决方案非常感兴趣:曾经有一个有趣的Java研究项目,用于正交透明的持久性,称为“森林”。您可能可以找到旧论文甚至源代码。

如果您正在寻找另一种语言来直接从内存中获取“对象”:C ++将使您这样做。 C ++编写的一些旧对象数据库使用此方法。 ...但是,嘿,那是疯狂的东西,使用页面故障来加载对象。这些对象数据库产生了不良图像。我希望我们能尽快再次扭转。

其他提示

这是不可能的。并且有几个充分的理由使运行时不允许这样做。

  • 对象的内存布局是JVM内部设备的一部分。每个JVM都可以做出自己的决策如何布局对象。这种布局可以改变版本。当您将对象映射到文件时,您会遇到麻烦。当对象延迟发生变化时会发生什么?崩溃,更新文件,魔术吗?在最终内存映射对象中,将需要指定固定的对象图。
  • 如果添加/删除字段会怎样?然后肯定会更改对象的距离。您无法使用旧的内存layout内存映射文件。
  • 一个对象还具有其他信息,例如虚拟功能通话,锁定状态的字段等。您还想要地图吗?可能不是,因为那是内部运行时状态。因此,您将需要忽略几个字节或拆分对象。这将使内存可能非常复杂。
  • 垃圾收集器压实内存,通过移动对象来最大程度地减少碎片。因此,需要对物体有“固定机制”。 (在.net中,对于互动季节)
  • 垃圾收集器几代人工作。如果首先分配给年轻一代的物体。在生存的情况下,它被转移到其他一代。内存映射的对象需要例外。

由于所有这些原因,您无法内存映射Java/.net-Objects。支持此功能将使JVM/CLR极为复杂。

JVM/CLR仍然使您可以访问内存映射的文件作为阵列式抽象,您可以在其中编写/读取字节。最重要的是,您可以实施自己的持久机制。从简单的序列化到复杂的数据库。有一些物体数据库非常接近提供透明的持久性。然后对象的行为就像持久的数据架构 /内存映射对象一样。

你不能。

Java,根据设计,强制执行类型的安全性和参考完整性。也就是说,如果我有一个参考类型T字段,我知道它指向T的实例。这与“不安全”语言形成鲜明对比的是C ++,在该语言中很有可能引用指向无效的位置,该引用可能会导致“内存损坏”。

如果Java允许将字节视为 Object, ,它不能保证这种参考完整性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top