首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在MC架构中,相互引用会导致内存泄漏。我如何改变一个好的设计程序?

在微服务架构(MC架构)中,相互引用可能导致内存泄漏的问题通常源于服务之间的循环依赖。这种循环依赖不仅影响内存管理,还可能导致服务启动失败或运行时性能下降。以下是一些基础概念和相关解决方案:

基础概念

  1. 微服务架构:一种将应用程序拆分为一组小型、独立服务的架构模式,每个服务运行在自己的进程中,通过轻量级机制通信。
  2. 循环依赖:两个或多个服务相互依赖,形成一个闭环,导致资源无法正确释放。

相关优势

  • 模块化:每个服务独立开发和部署,便于维护和扩展。
  • 灵活性:服务可以独立升级或替换,不影响其他服务。

类型与应用场景

  • 直接循环依赖:服务A依赖服务B,同时服务B又依赖服务A。
  • 间接循环依赖:服务A依赖服务B,服务B依赖服务C,而服务C又依赖服务A。

解决方案

1. 重构代码以消除循环依赖

通过重新设计服务接口和数据流,打破循环依赖。

示例: 假设有两个服务ServiceAServiceB相互依赖。

代码语言:txt
复制
// 原始设计
public class ServiceA {
    private ServiceB serviceB;

    public ServiceA(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}

public class ServiceB {
    private ServiceA serviceA;

    public ServiceB(ServiceA serviceA) {
        this.serviceA = serviceA;
    }
}

可以重构为:

代码语言:txt
复制
// 重构后设计
public class ServiceA {
    private ServiceBInterface serviceB;

    public ServiceA(ServiceBInterface serviceB) {
        this.serviceB = serviceB;
    }
}

public interface ServiceBInterface {
    void doSomething();
}

public class ServiceB implements ServiceBInterface {
    private ServiceAInterface serviceA;

    public ServiceB(ServiceAInterface serviceA) {
        this.serviceA = serviceA;
    }

    @Override
    public void doSomething() {
        // 实现逻辑
    }
}

public interface ServiceAInterface {
    void performAction();
}

2. 使用事件驱动架构

通过引入消息队列或事件总线,服务之间通过发布和订阅事件进行通信,减少直接依赖。

示例: 使用Kafka作为消息队列:

代码语言:txt
复制
// ServiceA 发布事件
public class ServiceA {
    private KafkaProducer<String, String> producer;

    public void performAction() {
        producer.send(new ProducerRecord<>("events", "actionPerformed"));
    }
}

// ServiceB 订阅事件
public class ServiceB {
    private KafkaConsumer<String, String> consumer;

    public void startListening() {
        consumer.subscribe(Arrays.asList("events"));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                if ("actionPerformed".equals(record.value())) {
                    // 处理事件
                }
            }
        }
    }
}

3. 引入中间层

创建一个独立的中间服务或API网关,负责协调各个服务之间的通信。

示例: 使用API网关:

代码语言:txt
复制
// API网关
public class ApiGateway {
    private ServiceA serviceA;
    private ServiceB serviceB;

    public void handleRequest(Request request) {
        if (request.getType().equals("A")) {
            serviceA.performAction();
        } else if (request.getType().equals("B")) {
            serviceB.doSomething();
        }
    }
}

总结

通过重构代码、使用事件驱动架构或引入中间层,可以有效解决微服务架构中的循环依赖问题,避免内存泄漏和其他潜在的性能问题。这些方法不仅提高了系统的稳定性,还增强了服务的独立性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Memory Leak: 识别、预防和修复内存泄漏 ️

Memory Leak: 识别、预防和修复内存泄漏 ️ 摘要 大家好,我是默语,擅长全栈开发、运维和人工智能技术。在这篇博客中,我将深入探讨内存泄漏(Memory Leak)的识别、预防和修复方法。...引言 内存泄漏是指程序在运行过程中无法释放不再需要的内存,从而导致系统内存资源被耗尽。内存泄漏会导致程序性能下降,严重时可能导致程序崩溃。在现代软件开发中,内存泄漏仍然是一个常见且难以调试的问题。...随着程序的运行,这些未释放的内存会逐渐积累,最终可能导致内存耗尽,程序崩溃。...new int[10]); 自动管理内存分配和释放 避免循环引用 避免循环引用 std::weak_ptr a_ptr; 避免两个对象相互引用导致的内存泄漏 需要小心设计对象的引用关系 未来展望...大家好,我是默语,擅长全栈开发、运维和人工智能技术。在我的博客中,我主要分享技术教程、Bug解决方案、开发工具指南、前沿科技资讯、产品评测、使用体验、优点推广和横向对比评测等内容。

26110

黑暗的内存管理

Eric Raymond 说,将策略与机制揉在一起会导致有两个问题,(1) 策略会变得死板,难以适应用户需求的改变;(2) 任何策略的改变都极有可能动摇机制。...没什么好方法,惟有提高自身修养,例如对于在函数中走的太远的堆空间,一定要警惕,并且思考是不是设计思路有问题,寻找缩短堆空间传播路径的有效方法。...如果是基于引用计数来实现内存自动回收,遇到这种对象之间相互引用的情况,虽然那程序不会崩溃,但是会出现内存泄漏,除非借助弱引用来打破这种这种引用循环,本质上这只是变相的谁最后使用,谁负责释放。...函数式编程范式中,内存泄漏问题依然很容易出现,特别是在递归函数中,通常需要借助一种很别扭的思维将递归函数弄成尾递归形式才能解决这种问题。另外,惰性计算也可能会导致内存泄漏。...似乎并没有任何一种编程语言能够真正完美的解决内存泄漏问题——有人说 Rust 能解决,我不是很相信,但是显而易见,程序在设计上越低劣,就越容易导致内存错误。

1.1K60
  • 面试官:Handler内存泄露的原因是什么?我:就这?太简单了吧,但我却被挂了...

    image.png 前言 嗨,大家好,问大家一个“简单”的问题: Handler内存泄露的原因是什么? 你会怎么答呢? 这是错误的回答 有的朋友看到这个题表示,就这?太简单了吧。...AndroidStudio会自动跳转到以下界面: image.png 可以看到左上角有一个Leaks,这就是你内存泄漏的点,点击就能看到内存泄漏的类了。右下角就是内存泄漏类的引用路径。...这里给大家提供一个方向,进行体系化的学习: 1、看视频进行系统学习 前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的...+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发 微信小程序:小程序介绍...3、读源码,看实战笔记,学习大神思路 “编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

    5.5K00

    面试造火箭,看下这些大厂Android中高级岗面试原题

    怎么在项目中进行架构设计的?MVP模式的优点,如何实现?MVVM了解吗? 网络请求大量图片并展示在页面上,需要注意什么?网络请求资源复用、图片缓存等 内存泄露有哪些?怎么处理?...内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。...2).多线程相关的匿名内部类和非静态内部类匿名内部类同样会持有外部类的引用,如果在线程中执行耗时操作就有可能发生内存泄漏,导致外部类无法被回收,直到耗时任务结束,解决办法是在页面退出时结束线程中的任务。...3).Handler内存泄漏Handler导致的内存泄漏也可以被归纳为非静态内部类导致的,Handler内部message是被存储在MessageQueue中的,有些message不能马上被处理,存在的时间会很长...7).资源对象未关闭导致如Cursor,File等,内部往往都使用了缓冲,会造成内存泄漏,一定要确保关闭它并将引用置为null。

    63810

    记一次线上事故的JVM内存学习

    第一个问题:为什么会频繁GC 有过JVM经验的开发者都应该知道,GC是在内存不够时,JVM自动进行的自我救赎(删除不用的数据,释放内存空间)。那么NameNode在什么情况下会进行GC呢?...由于JVM设计者认为,大部分的对象都是新创建的,生命周期都不长。因此新建的对象会直接放在新生代中,并采用复制回收机制。...线程详细信息:查看线程内部运行情况,死锁检查 CPU热点:检查系统哪些方法占用了大量CPU时间 内存热点:检查哪些对象在系统中数量最大 看看是不是内存发生泄漏,内存泄漏的情况: 静态集合类。...生命周期会跟类的生命周期一样,因此不会被GC 集合里面对象的属性改变。比如HashSet,改变了某个对象的属性,导致hashcode发生变化。但是引用还在。...在1.8中,这部分数据放入了一个叫做元空间的地方。 ?

    74000

    记一次OOM问题排查

    大家好,我是大彬~ 今天给大家分享最近出现的OOM问题。 上周五早上,测试同学反馈测试环境的子系统服务一直超时,请求没有响应。...上图中,MC已经接近元空间设置的上限值,也就是此时元空间内存已经不够用了,导致一直触发full gc。 然后就是dump内存进行分析,看看是什么原因导致的元空间内存溢出。使用命令....因为最近公司内部在推广一个漏洞监控工具,需要在服务端部署agent程序,这个工具会收集、监控应用程序运行时函数执行、数据传输,可以识别常见的安全缺陷和漏洞。...打开Histogram: Shallow Heap 代表一个对象结构自身所占用的内存大小,不包括其属性引用对象所占的内存。...在Histogram视图中,选中其中一个类点击鼠标右键会弹出一个菜单,选择Merge shortest paths to GC Roots,查看当前对象到GC Root的路径,可以过滤一些类型的引用。

    65531

    【Android面试帮助篇】被面试官怼了? 这里有20道面试真题,助力成为offer收割机!

    17、Android下解决滑动冲突的常见思路是什么? 18、如何把一个应用设置为系统应用? 19、Android内存泄露研究 20、内存泄露检测有什么好方法?...3、坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。 16、ANR是什么?...19、Android内存泄露研究 Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。...未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。 注册对象未反注册 未反注册会导致观察者列表里维持着对象的引用,阻止垃圾回收。...在Message中存在一个 target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。

    87420

    Android内存泄漏的原因、解决办法以及如何避免

    作为开发人员,在我们的日常开发中,为了构建更好的应用程序,我们需要考虑很多事情以保证应用运行在正轨上,其中之一是要确保我们的应用程序不会崩溃。应用崩溃的一个常见原因是内存泄漏。...为了帮助他人在代码分析上减少花费时间,我将介绍内存泄漏的几个例子,阐述在Android Studio中如何检查它们,当然最重要的是如何将其解决。...让我们再运行分析任务,看看这种改变是否消除了内存泄漏。 image.png 看来我们还有一些工作要做。根据前一个例子的经验,我们可以知道在引用树中高亮标注的实例导致了Activity泄露。...如同内部类,一个匿名类在Activity生命周期之外执行或在其他线程执行工作时,可能会导致内存泄漏。在这个例子中,我将使用流行的HTTP请求库Retrofit执行API调用,并传递响应给对应回调。...我会在Application中持有GitHubService引用,这不是一个特别好的设计,这仅仅服务于这个例子的目的。

    2.1K10

    你知道几种单例模式?

    比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。...(这规则后面再叙述)将程序编写顺序打乱——即写在后面的代码在时间顺序上可能会先执行,而写在前面的代码会后执行——以尽可能充分地利用CPU就会出现指令重排序(happen-before),从而导致上面的三个步骤执行顺序发生改变...正常情况下是123,但是如果指令重排后执行为1,3,2那么久会导致instance 为空,进而导致程序出现问题。 既然已经知道了上述双重检测机制会出现问题,那么我们该怎么避免出现,该如何解决呢?...,那么咱们就分析一下造成内存泄漏的原因,如上面代码,该单例模式中context是强引用,并且被static的变量instance持有,因为在java中静态变量在类被装载的时候分配内存,在被卸载的时候销毁...,所以导致系统GC的时候试图去回收Activity时,发现它却被单例LazySingleton所引用,所以GC回收失败,进而导致内存泄漏。

    38340

    年薪50万的Android岗,为什么连这7个Jetpack原理都答不上?

    大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。 眼下正是奋战金三银四的时候,日拱一卒,学习不能停啊!...30k+ 能设计Jetpack组件整合架构 “如何避免LiveData粘性事件?” 50k+ 改造Jetpack底层实现 “ViewModel如何穿透生命周期?”...onRetainNonConfigurationInstance()方法实现跨配置保存 高频误区: “ViewModel是单例模式”(错误率78%) “ViewModel可以直接持有Context”(会导致内存泄漏...实现精准重组范围控制 性能陷阱: 在重组中执行耗时操作 过度使用remember导致内存泄漏 优化方案: val listState = remember { derivedStateOf...和LiveData的基本用法 Level 2(30k+):能设计Jetpack组件整合架构 Level 3(50k+):能改造Jetpack底层实现 “只会用LiveData.observe()的开发者

    6110

    【Rust 基础篇】Rust 弱引用:解决引用循环与内存泄漏

    导言 在 Rust 中,引用循环是一种常见的编程问题,会导致资源无法被正确释放,从而造成内存泄漏。为了解决引用循环的问题,Rust 提供了弱引用(Weak Reference)机制。...本篇博客将详细介绍 Rust 弱引用的概念、用法,以及如何通过弱引用解决引用循环和内存泄漏问题。 引用循环的问题 引用循环在 Rust 中是指两个或多个对象之间相互引用,形成一个循环链。...这种情况下,对象之间的引用计数永远不会变为零,导致内存泄漏和资源泄漏。...引用循环的其它解决方案 除了使用弱引用外,还可以通过改变数据结构设计来避免引用循环的发生。一些解决方案包括使用辅助类型、懒加载等。具体解决方案的选择取决于应用场景和数据结构的需求。...总结 本篇博客详细介绍了 Rust 弱引用的概念、用法,以及如何通过弱引用解决引用循环和内存泄漏问题。

    49420

    面试官:谈谈你对ThreadLocal的理解?

    大家好,我是陌溪,欢迎点击下方的公众号名片,关注陌溪,让我们一起成长~ ThreadLocal 作为 Java 面试的高频题,陌溪在之前面试的时候也遇到过,所以后面专门针对 ThreadLocal 写了一份笔记...ThreadLocal早期内部结构 现在的设计 但是,JDK 后面优化了设计方案,在 JDK8 中 ThreadLocal 的设计是:每个 Thread 维护一个ThreadLocalMap,这个 Map...弱引用和内存泄漏 有些程序员在使用 ThreadLocal 的过程中会发现有内存泄漏的情况发生,就猜测这个内存泄漏跟Entry中使用了弱引用的 key 有关系。这个理解其实是不对的。...Memory leak:内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统溃等严重后果。I内存泄漏的堆积终将导致内存溢出。...就不会被回收( Entry 中包括了ThreadLocal实例和value),导致Entry内存泄漏。

    68720

    纳尼,Java 存在内存泄泄泄泄泄泄漏吗?

    写一个程序让出现内存泄漏 ①长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。...所以内存泄漏可能会导致内存溢出,但内存溢出并不完全都是因为内存泄漏,也有可能使用了太多的大对象导致。 05. 如何检测内存泄漏 最后一个重要的问题,就是如何检测 Java 的内存泄漏。...最后 以上内容其实是我曾经经常面试的内容之一,通过一系列的问题考察 Java 程序员对 Jvm 的理解。 比如我通常会问面试者,Java 中存在内存泄漏吗?...大部分人都会回答存在,接着我会问如果让你写一个程序让内存泄漏,你会怎么写?大部分程序员就回答不上来了。...如果面试者可以回答上面的问题,我会接着和面试者聊聊,内存泄漏和内存溢出他们之间是否存在联系 、以及在日常工作中如何避免写出内存泄漏的代码 、如果生产出现 Jvm 相关问题时,排查问题的思路和步骤等等。

    68610

    C++一分钟之-智能指针:unique_ptr与shared_ptr

    常见问题与易错点误用unique_ptr共享资源尝试复制unique_ptr会导致编译错误,因为它是独占所有权的。试图通过值传递或赋值方式分享unique_ptr管理的资源是错误的。...循环引用导致的内存泄漏使用shared_ptr时,如果不小心形成了循环引用(两个或多个shared_ptr互相引用形成闭环),即使所有指向它们的普通引用都已消失,它们的引用计数也不会降为零,从而导致资源无法释放...忽略裸指针转换从原始指针到智能指针的转换需谨慎,特别是当原始指针已被其他地方管理时,直接构造智能指针可能会导致重复释放资源。...重新设计数据结构:避免不必要的相互引用,或使用其他设计模式(如观察者模式)来替代直接的相互持有。明智地转换裸指针在将裸指针转换为智能指针之前,确保该指针未被其他智能指针管理。...}int main() { createChain(); // 所有资源在离开作用域时将被正确释放,无内存泄漏风险 return 0;}总结unique_ptr和shared_ptr是

    1.1K10

    Handler的5种内存泄漏场景

    大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。 为什么你的App越用越卡?...Handler作为Android消息机制的核心组件,非静态内部类、延迟消息、同步屏障等设计细节稍有不慎就会引发内存泄漏。...一、内存泄漏的“死亡三角” 任何内存泄漏都离不开三个要素(面试必考黄金法则): 1. 长生命周期对象持有短周期对象引用(如Looper持有Handler) 2....onDestroy() { removeCallbacksAndMessages(null) } } 三、高频面试题深度解析 Q1:nativePollOnce的阻塞机制如何导致泄漏...阻塞期间Handler存活 → 若此时关闭Activity,Message→Handler→Activity的引用链无法断开 Q2:如何设计永不泄漏的Handler?

    9410

    智能指针

    智能指针的使用原因及场景分析 在现代C++开发中,资源管理(包括内存、文件句柄、锁等)是一个至关重要的问题。特别是在异常安全性设计中,如何避免资源泄漏是开发者必须面对的挑战。 为什么需要智能指针?...但是,以下场景会导致资源管理复杂化: 异常抛出导致的资源泄漏 当程序执行到一半抛出异常时,如果之前分配的资源没有及时释放,就会产生资源泄漏问题。...weak_ptr 的作用 在使用 shared_ptr 管理资源时,特殊情况下,如果多个 shared_ptr 通过成员变量相互引用,就会形成循环引用,导致引用计数永不为 0,资源无法释放,进而引发内存泄漏问题...内存泄漏 内存泄漏指的是程序在运行过程中申请了内存资源,但由于程序设计疏忽或异常导致这些资源未被释放,从而使这部分内存资源无法再被使用或回收。...危害: 内存耗尽:内存不断泄漏会导致可用内存减少,系统或程序最终因无法分配内存而崩溃。 性能下降:内存泄漏会导致内存碎片化,降低程序和系统的内存分配效率,响应速度变慢。

    30610

    纳尼,Java 存在内存泄泄泄泄泄泄漏吗?

    写一个程序让出现内存泄漏 ①长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收。...所以内存泄漏可能会导致内存溢出,但内存溢出并不完全都是因为内存泄漏,也有可能使用了太多的大对象导致。 05. 如何检测内存泄漏 最后一个重要的问题,就是如何检测 Java 的内存泄漏。...最后 以上内容其实是我曾经经常面试的内容之一,通过一系列的问题考察 Java 程序员对 Jvm 的理解。 比如我通常会问面试者,Java 中存在内存泄漏吗?...大部分人都会回答存在,接着我会问如果让你写一个程序让内存泄漏,你会怎么写?大部分程序员就回答不上来了。...如果面试者可以回答上面的问题,我会接着和面试者聊聊,内存泄漏和内存溢出他们之间是否存在联系 、以及在日常工作中如何避免写出内存泄漏的代码 、如果生产出现 Jvm 相关问题时,排查问题的思路和步骤等等。

    86240

    android面试题2022

    大家好,又见面了,我是你们的朋友全栈君。 面试题除了你不会的其余都会,除了你不知道的其余都知道,除了你答不上来的都答上来了。 不积跬步无以至千里,多思考多学习,祝你早日成为大佬。...一、mt 1.内存优化常用手段 2.leacknanry的原理 3.腾讯bugly原理 4.自己实现一个日志收集的思路,如何收集crash信息 5.handler原理及源码 6.常见的内存泄漏的方式 7....bitmap是在什么内存里 1 android2.2(API level 8)和更早的版本,垃圾回收时,会阻塞UI线程,造成卡顿。...、兼容性好 Eventbus、retrofit注解实现原理 Retrofit底层实现的设计模式 观察者模式的缺点 1.可能会有阻塞问题 反序列化对单例的影响 1.对象改变了 增加read方法 mmkv原理...Foreach删除元素异常的原因 十一、ctr 1.glide原理 Picasso区别 2.leackcanary原理 3.项目架构搭建 4.多渠道打包 5.事件分发 6.动画区别 属性动画会有内存泄漏

    66630

    推荐一个检测 JS 内存泄漏的神器

    大家好,我是 ConardLi。作为一名 Web 应用程序开发者,排查和修复 JavaScript 代码的内存泄漏一直是最困扰我的问题之一。...虽然这种架构能够提供更快的用户交互、更好的开发者体验和更像原生应用程序的感觉,但是在客户端维护 Web 应用的状态会让内存的管理变得更加复杂。...虽然主流的 JavaScript 运行时都有垃圾回收机制,那么为什么还会有内存泄漏呢? JavaScript 代码中可能会有很多隐藏对象的引用,而隐藏的引用会以许多意想不到的方式导致内存泄漏。...在视图中,堆中的每个 JavaScript 对象或原生对象都是一个图节点,堆中的每个 JavaScript 引用都是一个图的边。...这意味着单个 React 组件泄漏可能会导致页面对象的重要部分泄漏,从而导致巨大的内存泄漏。

    3.7K20

    Java内存泄漏和垃圾收集器是什么样的关系呢

    由于根据JVM规范,每个堆都必须有一个垃圾收集器,这也意味着它不能再清空任何内存,堆被“活动”对象完全占用。 为了更好地理解这种情况是如何产生的,我首先要描述什么是Java中的“活动”对象。...支配者树则是一个子树,其中来自根节点的条件应用于所有子节点。如果根引用被释放,整个支配树将被释放。因此,在内存泄漏搜索中,非常大的控制树是非常好的候选。...正是后一种变体,即所谓的“爬行内存泄漏”,在许多应用程序中都会发现,而且这些问题通常会被“忽略”,并且会遇到以下措施: 更大的堆来争取时间,直到错误发生。...在本系列的下一部分“Java虚拟机的配置和监视”中,我将向您展示如何在sun jvm上配置和优化堆设置,以及如何使用JVM资源监视内存。...“控制”应用程序内存的一个好选择是 java.lang.ref 文件告诉JVM如何处理对象的引用—例如,如果您使用 WeakReference ,如果您的应用程序中不再使用该对象,则该引用不会阻止GC完成该对象

    49640
    领券