不Java虚拟机不断移动的物体在内存,如果有,它是如何处理更新提到该移动的对象?

我问是因为我是探索一个思想的存储目的的分布方式(ie。在多个服务器),但我需要移动的能力的对象服务器之间的对效率的原因。对象的需要,以便能够包含针对每个-其他,甚至对象在远程服务器上。我想想最好的方式来更新参考文献,移动的对象。

我的两个想法,所以到目前为止:

  1. 维持一个参考间接的地方,没有移动为对象的生命周期,如果我们更新对象的举动。但是这些间接管理?
  2. 保持一个列表的反向参与每个目的,因此,我们知道什么必须更新如果对象是移动。当然,这种创造性开销。

我感兴趣的反馈,这些办法,以及任何建议的替代办法。

有帮助吗?

解决方案

在提到上面的评论关于走这堆。

不同的GC是这样做的方式不同。

通常的复印的收藏家,当他们走的堆,它们不走的所有对象堆。而不是他们的生活中的对象堆。言下之意是,如果它们到达的"根源"的对象,对象是居住。

因此,在这个阶段已经触摸的所有活动对象无论如何,它的副本,他们是从旧堆的新堆。一旦复制的活动对象为完成,所有这一切仍然在老堆是目已经被复制,或垃圾。在这一点上,老堆可以被废弃。

两个主要好处这样的收集器,它契约堆在复制的阶段,而这只有副本的生活的对象。这是很重要的许多系统,因为有了这样的收集,目分配是便宜,从字面上多一点增加一堆的指针。当GC发生的,没有"死亡"的对象是复制的,所以他们不要慢集下来。它还在动态系统,还有很多更小的、临时的垃圾,不是有长期的垃圾。

此外,通过步行活动对象的图表,你可以看到的GC可以"知道"有关的每一目的,并跟踪它们任何地址,调整的目执行期间的副本。

这不是本论坛谈论深切关GC机制,因为它是一个不平凡的问题,但这是基本的怎么复制收集工作。

一个代际复制GC将把"老年"的对象,在不同的堆,那些最终被收低往往比"新的"堆。该理论认为,长期持久的对象获得晋升为老年人和获得收集来越少,改善了整体的GC性能。

其他提示

(实际上)任何垃圾收集系统具有用于移动物体内存在收拾他们更密集和避免碎片问题。

你在看什么是一个非常庞大而复杂的问题。我建议你读了现有的遥对象的风格API:.网远程处理和进一步回技术 CORBA

任何解决方案,用于跟踪的参考文献将是复杂的通过具有处理所有的故障模式中存在的分布式系统。JVM不必担心突然发现它可能看不到其一半的堆,因为一个网络开关的评价.

当你深入的设计,我认为很多这会降下来你想怎么处理不同的失败的情况。

应对评论:

你的问题谈论的对象存储在一个分布方式,而这正是什么。网远程处理和CORBA地址。诚然既不是技术支持移徙的这些对象(据我所知).但他们处理这两个广泛的概念的目的身份其中的一个关键部分是任何分布式对象的系统:怎么系统的不同部分知道其中的对象,他们是在谈论。

我不太熟悉的详细信息Java垃圾收集器,并且我是肯定的Java和。净垃圾收藏有很多的的复杂性,在他们为实现最高性能的最小影响的应用程序。

然而,基本想法,用于收集垃圾是:

  • VM停止所有的线运行的管理代码
  • 它执行一个可达性的分析从本组已知的'根源':静态变量的局部变量上的所有螺纹。对每个对象它发现它下的所有参考文献内的对象。
  • 任何对象,不确定的可达性分析是垃圾。
  • 对象还活着然后可向下移动在内存来收拾他们密集。这意味着任何对这些对象的引用还有待更新与新地址。通过控制当垃圾收集可能发生的VM能够保证没有目的的引用'在空'(ie。正在举行在一个机注册),这将导致一个问题。
  • 一旦完成该过程的VM开始的线执行。

为改进这一进程的VM可以执行世代垃圾收集,在那里单独堆是维持基于"年龄"的一个对象。对象开始在堆0如果他们存活的几个GCs那么迁移到堆的1和最终堆2(等等.净支持3个一代只不过).这样做的优势是,GC可以运行堆0集的非常频繁,而不必担心做的工作来证明长期生活的对象(其已经结束了在堆2)仍然活着的(这是他们几乎肯定是)。

还有其他改进,以支持并发垃圾收集,并详细说明围绕线,实际上是执行不受管理的代码时GC定,添加了更多的复杂性这个区域。

我是好奇的知道更多关于你的需求。作为另一个的回答表明,赤可能正是你所寻找的。

有细微的差别是什么之间陶提供,并且什么您要求,因此我的调查。

不同的是,作为你担心,赤不提供"远程"引用的对象在事实上整个"远程"这一概念的RMI,JMS,等等。是完全不存在时使用的陶土。

相反,在赤土,所有对象居住在虚拟大堆。螺纹,是否在1节点或节点2,节点3点4等所有有接到任何目的,在虚拟堆。

有没有特别的程学习,或者特别Api,目的在"虚拟"堆具有完全相同的行为对象的本地堆。

简言之,赤土提供的是一种编程模型用于多Jvm的运作完全相同的程序模型为一个单一的JVM。线在独立节点,只是表现得像线在一个单一的节点对象的突变,同步,等等,通知所有行为完全相同的跨节点作为横线-有没有差别。

此外,不同于任何解决方案来之前,对象引用保持在所有节点-这意味着你可以使用==.这所有的一部分,维持Java存储器模型的集群,这是基本要求"定期"Java(例如独的、同步的,等待/notify)的工作(没有工作,如果你不/不能保护对象的身份跨集群)。

因此,问题还是回到你,以进一步完善您的要求-目的是什么你需要的"远程"指点?

关键字你后是"实垃圾收藏家"。Jvm被允许使用一个,意味着,对象可以是重新安置。请咨询您的JVM的手册,以找出是否有你,看看是否有任何命令的行选项的影响。

这在概念上最简单的方式来解释压实是假设的垃圾收集冻结所有线程,搬迁的目的,搜索堆堆的所有提到这一目的,并更新他们的新地址。实际上这是比这更复杂,因为对于性能的原因你不要执行一个完整的扫线程停滞不前,这样一种递增的垃圾收集器会做的工作,在准备压实,只要它可以。

如果你有兴趣在间接引用,可以通过研究和软弱引用,并且还远程参考文献使用的各种RPC系统。

听起来就像你正在寻找一种分布式缓,类似的东西赤土或oracle java objece高速缓冲存储器(原tangersol).

如果你愿意,你可以看一看Boss缓存文档架构,并抓住它的一些源代码用作参考。

这不正是你所描述的,但它的工作非常相似。

这里就是链接。

http://www.jboss.org/jbosscache/

我希望这有所帮助。

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