网站首页 > java教程 正文
这是一个考察分布式系统底层机制的高阶Java面试题,通常出现在RMI(远程方法调用)或分布式框架相关的面试中。以下是清晰且专业的回答模板:
核心答案:
分布式垃圾回收(DGC)是 Java RMI 中用于回收远程对象(Remote Object)的机制。它解决的核心问题是:
当客户端持有远程对象的引用时,如何确保服务端不被无效对象占用内存?
DGC 的本质:
跨进程的引用跟踪与协作式清理
与传统JVM GC回收堆内存不同,DGC管理的是跨网络的远程对象生命周期。
DGC 工作原理(结合RMI场景):
核心角色:
角色 | 说明 |
客户端 | 持有远程对象的Stub(存根) |
服务端 | 真实远程对象所在JVM |
DGC守护线程 | 服务端后台线程,负责租约管理 |
工作流程:
- 客户端获取远程引用
客户端通过RMI Lookup获取服务端对象的Stub(如 MyRemoteObject stub = (MyRemoteObject) Naming.lookup("rmi://host/obj"))。 - 服务端注册租约(Lease)
- 当服务端向客户端返回Stub时,同时生成一个租约(Lease),包含:
- 远程对象标识(ObjID)
- 租约有效期(默认10分钟,可通过 java.rmi.dgc.leaseValue 调整)
- 服务端DGC守护线程记录该租约。
- 客户端定期“续租”
- 客户端持有Stub期间,每过1/3租期(如10分钟租期则每3分20秒)自动向服务端发送“脏调用”(Dirty Call):
- java
- // 伪代码:客户端行为 dgcService.dirty(leaseID, currentSequenceNum);
- 服务端收到后重置该租约的倒计时。
- 客户端释放引用时“清租”
- 当客户端Stub被GC回收时(或显式置null),发送“干净调用”(Clean Call):
- java
- // 伪代码:客户端行为 dgcService.clean(leaseID, currentSequenceNum);
- 服务端标记该租约可回收。
- 服务端回收对象
- 若租约过期(客户端崩溃/网络断开导致未续租)或收到 clean 调用,服务端DGC线程解除远程对象绑定,使其成为普通Java对象,由本地JVM GC回收。
关键机制:
机制 | 作用 |
租约(Lease) | 服务端跟踪客户端活跃状态的凭据,超时则释放对象引用 |
序列号(Sequence) | 每次调用递增,用于识别过期的旧请求(防重放攻击) |
弱引用(Weak Ref) | 服务端用弱引用持有远程对象,确保客户端失联时对象仍能被本地GC回收 |
DGC 的局限性:
- 网络依赖风险
- 客户端崩溃未发送 clean 调用 → 依赖租约超时回收(延迟释放)。
- 资源消耗
- 大量客户端时,服务端租约跟踪开销大。
- 安全问题
- 恶意客户端伪造 dirty 调用可阻止对象释放(需配合安全策略)。
- 替代方案兴起
- 现代分布式系统(如gRPC)通常采用基于HTTP/2的流控或连接级生命周期管理替代DGC。
面试加分回答:
“DGC 本质是分布式环境下的引用计数(Reference Counting) 的变体,但通过租约机制解决了纯计数中客户端崩溃导致的‘永久持有’问题。
在RMI中,它由 java.rmi.dgc 包下的 DGC 接口(服务端)和 Lease 类协作实现。
实践中需注意调整租约时长(-Djava.rmi.dgc.leaseValue=600000)以平衡网络延迟与内存占用。”
总结回答结构:
1. 定义:DGC是RMI中回收远程对象引用的跨JVM协作机制
2. 核心问题:解决客户端持有引用导致服务端内存泄漏
3. 工作原理:
- 租约注册(服务端)
- 定期续租(客户端dirty调用)
- 释放清租(客户端clean调用)
- 超时回收(服务端)
4. 补充:弱引用保障、序列号防重放、现代替代方案
掌握此逻辑,能体现你对分布式系统底层设计的深刻理解!
猜你喜欢
- 2025-06-12 JVM_什么是G1垃圾收集器#java编程
- 2025-06-12 那么大个对象的垃圾回收有什么不同
- 2025-06-12 Java11 的 G1 垃圾收集器(java垃圾收集器的种类)
- 2025-06-12 面试Java被问JVM:你来详细聊一下G1垃圾收集器
- 2025-06-12 面试官:什么是垃圾回收?-(垃圾回收系列:1)
- 2025-06-12 Java性能优化要点之:GC垃圾回收知识点整理
- 2025-06-12 深入浅出JVM之垃圾回收算法(jvm垃圾回收算法和垃圾回收器)
- 2025-06-12 JVM(Java虚拟机)内存结构和垃圾回收(GC)机制
- 2025-06-12 Java 为什么不采用 360 垃圾清理来进行垃圾回收呢?
- 2025-06-12 JVM03——四种垃圾回收算法,你都了解了哪几种
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)