'serializing' 对象完整记忆的概念
Concept of 'serializing' complete memory of object
我想问一个非常笼统的问题,关于一个我不知道它是否存在或是否可行的技术概念。
思路如下:
我有一个垃圾收集语言的对象(例如 C# 或 Java)。对象本身可能包含多个对象,但没有对不是对象(或对象本身)的子元素的任何其他对象的引用。
从理论上讲,可以获得此对象使用的内存,这很可能不是一个连接的部分。因为我对对象有一些了解,所以我可以找到所有引用 variables/properties 和指向另一块内存的指针(可能是间接的,取决于编程语言和虚拟机的实现)。我可以将这段内存组合成更大的内存(更正 references/pointers 以便它们仍然完好无损)。这段内存,基本上是字节,可以写入存储,例如数据库或 redis 缓存。在另一台机器上,理论上我可以再次加载这个对象并将其放入虚拟机的内存中(如果它们是绝对的而不是相对的,可能会再次更正 references/pointers )。然后我应该在另一个虚拟机上有相同的对象。该对象可以像我想要的那样复杂,也可以包含事件或其他任何东西,我将能够将对象的状态传输到另一个 VM(运行 在另一台计算机上)。唯一的条件是它不会包含对对象之外的东西的引用。当然,我必须知道另一个 VM 上对象的 class 类型。
我问这个问题是因为我想共享一个对象的状态,我认为所有这些序列化工作只是一种开销,如果我可以冻结内存并传输到另一个 VM,这将非常简单。
这样的事情可能吗,我会说是的,尽管它可能很复杂。由于其架构,某些 VM 可能无法使用。任何编程语言中都存在这样的东西吗?甚至可能使用非垃圾收集语言?
注意:除了编程语言之外,我不确定应该向这个问题添加什么标签,我也不确定是否有更好的地方来解决这样的问题。所以请见谅。
编辑:
也许这个概念可以比作 Linux 上的 initrd 或一般的休眠。
- 您将必须收集对其他对象的所有引用。包括没有重复的对象(循环)图。至少对于序列化线程,它需要某种 'stop the world' 。有效地做到这一点很复杂但可能 - 许多语言的本机序列化机制 (java) 正在为开发人员做这件事。
- 您将需要某种虚拟机来从不同硬件架构中的字节顺序中抽象出来。
- 您将不得不从任何类型的环境中分离对象。你不能传递代表线程、文件句柄、套接字等的对象。你将如何检测它?
- 如今系统内存是虚拟的,因此不可能简单地将地址从一台机器复制到另一台机器 - 您必须转换它们
- 对象不仅是开发人员可见的数据,它也是结构、沙盒信息、权限、超级classes、method/types 已经加载的内容和由于优化而仍未加载的内容和延迟加载、垃圾收集器元数据等
- 你的 object/class 版本。在一台机器上 class A 可以从版本 1 的源代码创建,但在另一台机器上可能已经有 class A 的对象从版本 2
的源代码构建
- 考虑性能。它会比老式连载更快吗?它有什么好处?
- 可能还有很多我们 none 想到的事情
所以:我从来没有听说过这样的解决方案。这在理论上似乎是可行的,但出于某种原因,从来没有人这样做过。每个人都提供普通的旧程序化序列化。也许您发现了新的、更好的方法,但请记住,您将与大众背道而驰
我想问一个非常笼统的问题,关于一个我不知道它是否存在或是否可行的技术概念。
思路如下:
我有一个垃圾收集语言的对象(例如 C# 或 Java)。对象本身可能包含多个对象,但没有对不是对象(或对象本身)的子元素的任何其他对象的引用。 从理论上讲,可以获得此对象使用的内存,这很可能不是一个连接的部分。因为我对对象有一些了解,所以我可以找到所有引用 variables/properties 和指向另一块内存的指针(可能是间接的,取决于编程语言和虚拟机的实现)。我可以将这段内存组合成更大的内存(更正 references/pointers 以便它们仍然完好无损)。这段内存,基本上是字节,可以写入存储,例如数据库或 redis 缓存。在另一台机器上,理论上我可以再次加载这个对象并将其放入虚拟机的内存中(如果它们是绝对的而不是相对的,可能会再次更正 references/pointers )。然后我应该在另一个虚拟机上有相同的对象。该对象可以像我想要的那样复杂,也可以包含事件或其他任何东西,我将能够将对象的状态传输到另一个 VM(运行 在另一台计算机上)。唯一的条件是它不会包含对对象之外的东西的引用。当然,我必须知道另一个 VM 上对象的 class 类型。
我问这个问题是因为我想共享一个对象的状态,我认为所有这些序列化工作只是一种开销,如果我可以冻结内存并传输到另一个 VM,这将非常简单。
这样的事情可能吗,我会说是的,尽管它可能很复杂。由于其架构,某些 VM 可能无法使用。任何编程语言中都存在这样的东西吗?甚至可能使用非垃圾收集语言?
注意:除了编程语言之外,我不确定应该向这个问题添加什么标签,我也不确定是否有更好的地方来解决这样的问题。所以请见谅。
编辑:
也许这个概念可以比作 Linux 上的 initrd 或一般的休眠。
- 您将必须收集对其他对象的所有引用。包括没有重复的对象(循环)图。至少对于序列化线程,它需要某种 'stop the world' 。有效地做到这一点很复杂但可能 - 许多语言的本机序列化机制 (java) 正在为开发人员做这件事。
- 您将需要某种虚拟机来从不同硬件架构中的字节顺序中抽象出来。
- 您将不得不从任何类型的环境中分离对象。你不能传递代表线程、文件句柄、套接字等的对象。你将如何检测它?
- 如今系统内存是虚拟的,因此不可能简单地将地址从一台机器复制到另一台机器 - 您必须转换它们
- 对象不仅是开发人员可见的数据,它也是结构、沙盒信息、权限、超级classes、method/types 已经加载的内容和由于优化而仍未加载的内容和延迟加载、垃圾收集器元数据等
- 你的 object/class 版本。在一台机器上 class A 可以从版本 1 的源代码创建,但在另一台机器上可能已经有 class A 的对象从版本 2 的源代码构建
- 考虑性能。它会比老式连载更快吗?它有什么好处?
- 可能还有很多我们 none 想到的事情
所以:我从来没有听说过这样的解决方案。这在理论上似乎是可行的,但出于某种原因,从来没有人这样做过。每个人都提供普通的旧程序化序列化。也许您发现了新的、更好的方法,但请记住,您将与大众背道而驰