和单机系统类似, 分布式系统也需要自动清除不再有客户端引用的对象(remote object)。 远程对象的自动垃圾回收机制, 将程序员从深坑中解放出来, 不再需要人工跟踪client所引用的对象了. RMI的垃圾回收算法为 引用计数法(reference-counting), 和 Modula-3’s Network Objects 很相似.(详情请搜索 “Network Objects”)

为实现引用计数, RMI 运行时需要跟踪各JVM中的存活对象引用. 当一个对象引用进入JVM时, 它的引用次数加 1; client第一次引用某个对象时, 会向服务器发送一条 “referenced” 消息. 在本地JVM中, 如果释放某个引用一次, 则引用次数减 1。当最后一个引用被丢弃时, 向服务器发送一条 “unreferenced” 消息. 协议中有很多坑; 但大多数消息都是在维护 referenced 和 unreferenced 消息, 目的是确保这些对象不会被过早回收(prematurely collected)。

如果某个 remote object 不再被任何客户端引用, RMI运行时就会使用弱引用来指向它. 假如服务端也不存在其他强引用, 那么在垃圾收集时, 就有可能会将弱引用丢弃. 分布式垃圾收集算法, 与 client JVM 之间, 主要是通过常规引用(normal reference), 以及弱引用(weak reference)的方式来进行交互。

只要客户端还有引用指向 remote object, 就不应该回收服务器中的这个对象, 有可能还会通过该对象进行远程调用(remote call), 或者作为返回值传递给客户端. 服务端在传递 remote object 给 client 时,会添加客户JVM的标识, 然后放到 referenced set 中。 远程对象必须实现 java.rmi.server.Unreferenced 接口, 以支持 unreferenced 通知。当客户端发现没有任何引用指向 remote object 时, 就会调用该对象的 unreferenced方法。unreferenced 方法可能会被调用多次, 只要客户端发现 references set 是空的就会调用一次。远程对象的回收, 只有当本地引用和远程引用都不存在时, 才会进行。

注意, 如果客户端和remote server object 之间发生网络分裂(network partition), 可能会造成过早回收(因为网络不通, server 会认为客户端崩溃了). 因为有过早回收(premature collection)的可能, 所以 remote reference 不能保证引用的完整性; 换句话说, 可能某个 remote reference 指向的对象并不存在了。这时候再使用这种 reference 就会抛出 RemoteException, 这种情况必须由开发人员编写代码进行捕获和处理。

原文链接: https://docs.oracle.com/javase/8/docs/platform/rmi/spec/rmi-arch4.html

翻译日期: 2017年06月26日

翻译人员: 铁锚: http://blog.csdn.net/renfufei

RMI垃圾收集简介的更多相关文章

  1. 1. 垃圾收集简介 - GC参考手册

    说明: 在本文中, Garbage Collection 翻译为 “垃圾收集”, garbage collector 翻译为 “垃圾收集器”; 一般认为, 垃圾回收 和 垃圾收集 是同义词. Mino ...

  2. 【Java GC系列】垃圾收集简介(1)

    说明: 在本文中, Garbage Collection 翻译为 "垃圾收集", garbage collector 翻译为 "垃圾收集器"; 一般认为, 垃圾 ...

  3. 垃圾收集简介 - GC参考手册

    http://blog.csdn.net/column/details/14851.html

  4. RMI和socket详解

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp58   一般来说,基于CS(client-server)软件架构的开发技 ...

  5. RMI RPC socket

      1.RPC RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC不依赖于具体的 ...

  6. 2. Java中的垃圾收集 - GC参考手册

    标记-清除(Mark and Sweep)是最经典的垃圾收集算法.将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境.下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保 ...

  7. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  8. JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  9. 4. GC 算法(实现篇) - GC参考手册

    您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 Java中的垃圾收集 - GC参考手册 GC 算法(基础篇) - GC参考手册 学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算 ...

随机推荐

  1. redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first

    分析:出现此错误的原因是redis版本过高导致的,因此降低redis版本即可 解决: pip install -U redis==2.10.6

  2. An Example for Javascript Function Scoping and Closure

    1. An Real World Example In the patron detail page of the CRM system I'm working with, there’re larg ...

  3. python-打印进度条

    progress_bar.py #!/usr/bin/python3.6 #__*__uft8__*__ import sys import time def progress(percent,wid ...

  4. com.mysql.jdbc.MysqlDataTruncation:Data Truncation:Data too long for column '字段name' at row 1

    1.问题描述: 在mysql插入数据的时候报错:Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long fo ...

  5. spring boot 集成kafka (多线程,消费者使用kafka的原生api实现,因为@KakfkaListener修改groupId无效)

    application-test.properties #kafka kafka.consumer.zookeeper.connect=*:2181 kafka.consumer.servers=*: ...

  6. 通过Fiddler进行手机抓包

    通过Fiddler进行手机抓包 通过Fiddler抓包工具,可以抓取手机的网络通信,但前提是手机和电脑处于同一局域网内(WI-FI或热点),然后进行以下设置: 用Fiddler对Android应用进行 ...

  7. 爬虫bs4

    CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...

  8. tcp cubic代码分析

    /* * TCP CUBIC: Binary Increase Congestion control for TCP v2.3 * Home page: * http://netsrv.csc.ncs ...

  9. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

  10. PHP整数取余返回负数的相关解决方法

    PHP语言虽然功能强大,但并不代表其没有缺点,在编写代码的过程中未免会遇到一些让人头痛的问题.下面我们将为大家介绍有关PHP整数取余返回负数的解决办法. 我们先来看个例子. $res = 162447 ...