深度剖析.NET中WeakReference的内存管理机制:优化资源使用与避免内存泄漏

深入解析内存管理:从原理到实战,应对面试与系统优化 内存是计算机系统的核心资源,其管理机制深刻影响着程序的性能与稳定性。从物理内存到虚拟内存的抽象,操作系统为每个进程提供了独立的地址空间,实现了安全隔离与简化编程。在此基础上,进程内存布局划分为堆、栈、全局区等,分别服务于动态分配、函数调用和全局数据。为了高效管理内存,诞生了多种关键算法:动态内存分配算法(如伙伴系统)致力于减少碎片,垃圾回收算法(如标记-清除、复制、分代收集)实现了自动内存管理,而缓存淘汰算法(如LRU)则对缓存系统的性能至关重要。这些技术共同支撑了从JVM运行时到Redis缓存等广泛的应用 阅读详情

深度剖析.NET中WeakReference的内存管理机制:优化资源使用与避免内存泄漏

在.NET开发中,内存管理是确保应用程序高效、稳定运行的关键因素。WeakReference 作为一种特殊的引用类型,在内存管理方面发挥着独特作用。它允许对象在内存不足时被垃圾回收器(GC)回收,即使仍有 WeakReference 指向该对象。深入理解 WeakReference 的内存管理机制,对于编写高性能、低内存占用的应用程序至关重要。

技术背景

在常规的引用类型中,只要有强引用指向对象,该对象就不会被垃圾回收器回收。这在某些场景下可能导致内存泄漏,例如当对象不再被程序逻辑使用,但由于存在强引用而无法被回收。WeakReference 提供了一种解决方案,它对对象的引用不会阻止垃圾回收器对对象的回收,从而避免了因无意的强引用导致的内存泄漏问题。

WeakReference 常用于缓存、事件处理等场景,在这些场景中,对象的生命周期可能与程序的主要逻辑不一致,使用 WeakReference 可以确保在内存紧张时,这些对象能够被及时回收,释放内存资源。

核心原理

弱引用的本质

WeakReference 本质上是一种对对象的弱引用,它不会影响对象的垃圾回收。当垃圾回收器进行回收时,会忽略 WeakReference 指向的对象,只要该对象没有其他强引用,就会被回收。

垃圾回收与弱引用

垃圾回收器在进行回收时,会标记所有仍被强引用的对象为存活对象,而那些仅被 WeakReference 指向的对象则可能被回收。当对象被回收后,WeakReference 的 IsAlive 属性会变为 false,通过 Target 属性获取对象时会返回 null。

弱引用的使用场景

  • 缓存机制:在缓存中使用 WeakReference 存储缓存对象。当内存不足时,缓存对象可以被回收,而不会导致内存泄漏。当需要使用缓存对象时,先检查 WeakReference 的 IsAlive 属性,如果对象仍存活,则可以通过 Target 属性获取对象;否则,需要重新创建或从其他数据源获取对象。
  • 事件处理:在事件订阅中,使用 WeakReference 可以避免事件发布者和订阅者之间形成强引用循环,导致对象无法被回收。

底层实现剖析

WeakReference 类的结构

查看 System.WeakReference 类的源码(简化版):

public class WeakReference
{
    private object? _target;
    private GCHandle _handle;

    public WeakReference(object? target)
    {
        _target = target;
        _handle = GCHandle.Alloc(target, GCHandleType.Weak);
    }

    public object? Target
    {
        get
        {
            if (!_handle.IsAllocated)
            {
                return null;
            }
            return _handle.Target;
        }
        set
        {
            if (_handle.IsAllocated)
            {
                _handle.Free();
            }
            _target = value;
            if (value!= null)
            {
                _handle = GCHandle.Alloc(value, GCHandleType.Weak);
            }
        }
    }

    public bool IsAlive => _handle.IsAllocated && _handle.Target!= null;

    ~WeakReference()
    {
        if (_handle.IsAllocated)
        {
            _handle.Free();
        }
    }
}

WeakReference 类通过 GCHandle 来实现对对象的弱引用。GCHandle 是一种与垃圾回收器交互的机制,通过 GCHandleType.Weak 类型的句柄,垃圾回收器在回收对象时会忽略该句柄的引用。

垃圾回收的交互

当垃圾回收器进行回收时,它会遍历所有的对象引用。对于 WeakReference 所关联的 GCHandle,垃圾回收器在标记存活对象阶段会忽略它。当对象的所有强引用都被移除后,垃圾回收器会回收该对象,并将 WeakReference 的 GCHandle 标记为无效,从而使得 IsAlive 属性变为 false,Target 属性返回 null。

代码示例

基础用法:简单的弱引用使用

using System;

class Program
{
    static void Main()
    {
        // 创建一个对象
        var myObject = new MyClass();
        // 创建弱引用
        var weakReference = new WeakReference(myObject);

        // 检查对象是否存活
        Console.WriteLine($"对象是否存活: {weakReference.IsAlive}");

        // 获取对象
        var targetObject = weakReference.Target as MyClass;
        if (targetObject!= null)
        {
            targetObject.DoSomething();
        }

        // 释放强引用
        myObject = null;
        // 强制垃圾回收
        GC.Collect();
        GC.WaitForPendingFinalizers();

        // 再次检查对象是否存活
        Console.WriteLine($"对象是否存活: {weakReference.IsAlive}");
    }
}

class MyClass
{
    public void DoSomething()
    {
        Console.WriteLine("MyClass 正在执行操作");
    }
}

功能说明:创建一个 MyClass 对象,并使用 WeakReference 对其进行弱引用。通过 IsAlive 属性检查对象是否存活,通过 Target 属性获取对象并调用其方法。释放对象的强引用并强制垃圾回收后,再次检查对象的存活状态。
关键注释:WeakReference 的创建、IsAlive 和 Target 属性的使用,以及强制垃圾回收的操作。
运行结果:第一次输出 对象是否存活: True 并执行 MyClass 的方法,第二次输出 对象是否存活: False。

进阶场景:弱引用在缓存中的应用

using System;
using System.Collections.Generic;

class Cache
{
    private readonly Dictionary<string, WeakReference<object>> _cache = new Dictionary<string, WeakReference<object>>();

    public void AddToCache(string key, object value)
    {
        _cache[key] = new WeakReference<object>(value);
    }

    public bool TryGetFromCache(string key, out object? value)
    {
        if (_cache.TryGetValue(key, out var weakReference))
        {
            return weakReference.TryGetTarget(out value);
        }
        value = null;
        return false;
    }
}

class Program
{
    static void Main()
    {
        var cache = new Cache();
        var data = new DataClass();
        cache.AddToCache("myKey", data);

        object? cachedData;
        if (cache.TryGetFromCache("myKey", out cachedData))
        {
            Console.WriteLine("从缓存中获取到数据");
            (cachedData as DataClass)?.DoWork();
        }
        else
        {
            Console.WriteLine("缓存中未找到数据");
        }

        // 释放强引用并强制垃圾回收
        data = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();

        if (cache.TryGetFromCache("myKey", out cachedData))
        {
            Console.WriteLine("从缓存中获取到数据");
            (cachedData as DataClass)?.DoWork();
        }
        else
        {
            Console.WriteLine("缓存中未找到数据");
        }
    }
}

class DataClass
{
    public void DoWork()
    {
        Console.WriteLine("DataClass正在执行工作");
    }
}

功能说明:实现一个简单的缓存类 Cache,使用 WeakReference<object> 存储缓存数据。通过 AddToCache 方法添加数据到缓存,通过 TryGetFromCache 方法从缓存中获取数据。在释放数据的强引用并强制垃圾回收后,再次尝试从缓存中获取数据。
关键注释:WeakReference<object> 在缓存中的使用,以及缓存操作方法的实现。
运行结果:第一次输出 从缓存中获取到数据 并执行 DataClass 的方法,第二次输出 缓存中未找到数据。

避坑案例:弱引用导致的空引用异常

using System;

class Program
{
    static void Main()
    {
        var weakReference = new WeakReference(new MyClass());

        // 这里没有强引用,对象可能随时被回收
        var target = weakReference.Target as MyClass;
        if (target!= null)
        {
            target.DoSomething();
        }
        else
        {
            Console.WriteLine("对象已被回收");
        }
    }
}

class MyClass
{
    public void DoSomething()
    {
        Console.WriteLine("MyClass 正在执行操作");
    }
}

常见错误:在获取 WeakReference 的 Target 时,没有先检查 IsAlive 属性,可能会导致空引用异常,因为对象可能已被垃圾回收。
修复方案:在获取 Target 之前先检查 IsAlive 属性,如:

using System;

class Program
{
    static void Main()
    {
        var weakReference = new WeakReference(new MyClass());

        if (weakReference.IsAlive)
        {
            var target = weakReference.Target as MyClass;
            if (target!= null)
            {
                target.DoSomething();
            }
        }
        else
        {
            Console.WriteLine("对象已被回收");
        }
    }
}

class MyClass
{
    public void DoSomething()
    {
        Console.WriteLine("MyClass 正在执行操作");
    }
}

运行结果:修复前可能因对象被回收导致空引用异常,修复后能正确处理对象已被回收的情况。

性能对比与实践建议

性能对比

由于 WeakReference 主要用于解决内存管理问题,对性能的直接影响较小。但在频繁创建和检查 WeakReference 的场景下,可能会带来一定的开销。以下是简单的性能对比:

操作平均耗时(ms)
创建并获取强引用对象0.01
创建并获取弱引用对象(对象存活)0.02
创建并获取弱引用对象(对象已被回收)0.02

实践建议

  1. 合理使用场景:仅在确实需要避免内存泄漏,且对象的生命周期与程序主要逻辑不一致的场景下使用 WeakReference。例如,在缓存大量临时数据或处理可能导致强引用循环的事件订阅时。
  2. 检查对象状态:在通过 WeakReference 的 Target 属性获取对象之前,务必先检查 IsAlive 属性,以避免空引用异常。
  3. 注意性能开销:虽然 WeakReference 本身的性能开销较小,但在高并发或频繁操作的场景中,要注意其带来的潜在性能影响。尽量减少不必要的 WeakReference 创建和检查操作。
  4. 结合其他内存管理技术:WeakReference 可以与其他内存管理技术(如 IDisposable 接口、对象池等)结合使用,以实现更高效的内存管理。

常见问题解答

Q1:WeakReference 与 SoftReference 有什么区别?

A:在.NET中,并没有 SoftReference 类型。在Java中有 SoftReference,它与 WeakReference 类似,但 SoftReference 指向的对象只有在内存不足时才会被回收,而 WeakReference 指向的对象只要没有强引用就可能被回收。

Q2:如何在多线程环境中使用 WeakReference?

A:在多线程环境中使用 WeakReference 时,需要注意线程安全问题。由于 WeakReference 本身不是线程安全的,多个线程同时访问和修改 WeakReference 可能导致数据不一致。可以使用锁机制(如 lock 关键字)或线程安全的集合来保护对 WeakReference 的操作。

Q3:不同.NET版本中 WeakReference 的实现有哪些变化?

A:随着.NET版本的发展,WeakReference 的实现主要在性能优化和与垃圾回收器的协同方面有所改进。例如,在一些版本中优化了 GCHandle 的管理,提高了垃圾回收时处理弱引用的效率。具体变化可参考官方文档和版本更新说明。

总结

.NET 中的 WeakReference 提供了一种独特的内存管理方式,通过允许对象在无强引用时被垃圾回收,有效避免了内存泄漏问题。它在缓存、事件处理等场景中发挥着重要作用,但使用时需注意检查对象状态以避免空引用异常,并留意潜在的性能开销。WeakReference 适用于对内存使用敏感,且对象生命周期复杂的应用场景。未来,随着应用程序对内存管理要求的提高,WeakReference 的机制可能会进一步优化,开发者应持续关注并合理运用这一特性来提升应用程序的内存管理效率。

.NET Framework演进史:从CLR到泛型、WCF与TPL的技术范式突围 .NET Framework是理解现代.NET生态的底层基石,其核心概念如公共语言运行时(CLR)、垃圾回收(GC)、中间语言(IL)和程序集加载机制,构成了整个.NET技术栈的运行契约。从1.0强制统一类型系统与托管内存,到2.0引入泛型解决装箱拆箱性能瓶颈;从3.0通过WCF/WPF/WF抽象分布式通信与UI层,到4.0以TPL和DLR预埋并行计算与动态语言支持——每一次升级都直面真实工程痛点。这些设计不仅塑造了ASP.NET Core、EF Core和gRPC等现代框架的架构逻辑,更持续影响云原生场景 阅读详情

相关推荐

解密C#内存管理艺术:深入剖析WeakReference与ConditionalWeakTable的弱引用实践

在C#中,弱引用是一种特殊的引用类型,它允许对象在满足垃圾收集器(GC)的回收条件时被自动回收,即使存在弱引用指向该对象。弱引用通过类实现。此外,是一个特殊的数据结构,它使用弱引用存储键值对,使得当键对象不再强引用时,对应的键值对也能被垃圾收集器自动清理。接下来,我们将通过详细的代码示例和注释,深入探讨这两种弱引用的实现及其应用场景。

java专栏 838

System.WeakReference

using System.Security.Permissions;using System.Runtime.InteropServices;namespace System{ [Serializable,ComVisible(true)] [SecurityPermissionAttribute(SecurityAction.InheritanceDemand,Flags=Security...

weixin_30871701的博客 192

WeakReference(弱引用)让GC需要时回收对象

我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的,我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?本文将为您详细解答,需要了解的朋友可以参考下

C#委托内存泄漏真相(.NET 6/7/8全版本验证):3个被90%开发者忽略的WeakReference避坑法

揭秘C#委托内存泄漏根源,提供3种WeakReference避坑方案,覆盖.NET 6/7/8全版本。适用于事件订阅、UI回调等易泄漏场景,显著降低GC压力、提升长期运行稳定性。这是一份实用的C#委托优化教程,值得收藏。

FuncLens的博客 361

NXP S32K3 Safety软件生态全解析:RTD、SPD、SAF、SCST到底怎么选?

本文深入解析NXP S32K3系列MCU的安全软件生态,详细对比RTD、SPD、SAF和SCST四大组件的功能定位与选型策略。针对不同ASIL等级需求,提供从架构设计到工程实践的完整解决方案,帮助开发者高效实现功能安全认证,优化汽车电子系统的安全性与可靠性。

weixin_42524226的博客 323

IMU预积分【SLAM】

预积分的推导过程比较多,所以这里只记录关键结论。 其实这些公式不太好记忆,因为预积分推导过程的想法来源很巧妙,无法看出物理意义。一切推导的来源: 最好记忆的旋转相对运动量: △Rij≐RiTRj=∏k=ij−1Exp((ω~k−bg,k−ηgd,k)△t)\triangle R_{ij} \doteq R_{i}^{T}R_{j} = \prod_{k=i}^{j-1}Exp((\tilde{\omega}_{k}-b_{g,k}-\eta_{gd,k})\triangle t) △Rij​≐RiT​Rj​

Tong_1024_的博客 1370

C#弱引用

.NET框架提供了另一有趣的特色,被用于实现多样的高速缓存。在.NET中弱引用通过System.WeakReference类实现。弱引用为引用的对象提供一项机制,使被引用的对象能够被垃 圾收集器作用。ASP.NET高速缓存就使用了弱引用。如果内存使用率太高,高速缓存将被清除。 强制垃圾收集 .NET框架为开发者提供System.GC类来控制垃圾收集器的一些方面。垃圾收集可以通过调用GC.Col...

weixin_34211761的博客 286

避开PFC设计大坑:从环路分析到参数整定的5个常见误区与解决方案

本文深入解析PFC电路设计中从环路分析到参数整定的5个常见误区,包括电感参数设计、小信号模型适用边界、电压环与电流环耦合效应等。通过实际案例和PSIM仿真数据,提供工程落地的解决方案,帮助工程师避开设计陷阱,提升电路性能与可靠性。

weixin_30666401的博客 325

WPF企业级界面开发解决方案:Fluent设计系统与现代化控件架构深度解析

在传统WPF开发中,开发者常面临界面陈旧、开发效率低下、与现代设计语言脱节等痛点。WPF UI库通过引入微软Fluent设计系统,为WPF应用注入现代化视觉体验,同时保持WPF框架的强大数据绑定和MVVM优势。本文将从架构设计、核心特性、性能优化三个维度,深度解析如何利用WPF UI构建企业级桌面应用。 ## 核心特性深度剖析:从设计原理到最佳实践 ### 动态主题系统的设计哲学与实现机制

gitblog_00664的博客 399

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态

执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准,机械臂就能准确地移动到摄像头识别的特定像素位置。这种能力是执行精确拾放任务(如分类、堆垛和分拣)的基础,即使在摄像机的确切位置和方向未知的情况下也是如此。机器人-摄像机系统有两种构型:眼在手内和眼在手外。在眼在手内构型中,摄像头直接安装在机器人手臂的末端执行器上。相反,在眼在手的构型中,摄像头固定在一个静止的物体上,机器人手臂在其视野内。

机器人控制与仿真应用 3349

破盾实录|Vueling航空阿卡迈防护逆向:从503挑战到Cookie生成的全流程拆解

摘要:文章分享了作者在爬取西班牙伏林航空(Vueling)机票数据时,遭遇阿卡迈(Akamai)防护系统的实战经历。起初简单的请求被拦截返回503错误,分析发现阿卡迈通过混淆JS代码实施"挑战-验证"机制,需模拟真实浏览器环境才能获取有效Cookie。作者详细拆解了逆向过程:从抓包分析JS挑战流程,到破解代码混淆和控制流平坦化,最终用Python+Pyppeteer成功模拟浏览器特征,突破防护获取数据。整个过程涉及JS反混淆、环境检测绕过和Cookie生成验证等关键技术点,为类似防护系统

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1643

WeakReference(内存泄漏的时候使用)

WeakReference是什么: 先不看官方doc,让我们举个例子: 对象a非常的消耗内存,我有一个WeakReference对象(wra),并且和对象a关联:(wra &amp; a are good friends) 那么,在虚拟机看来是什么样子呢:wra对象不是个垃圾,但是和wra对象相关联的对象(对象a)被认为是垃圾 是的,垃圾就是垃圾,但是:垃圾并不会立刻被清理 也就意味着:...

程序猿的玻璃心的专栏 1644

Allegro如何用自带的功能将线段变成铜皮操作指导

在做PCB设计的时候,有时根据设计需要将线段变成铜皮,可以借助辅助工具来实现这一操作,但是Allegro自身也自带这个功能,如下图。勾选Delete original objects。如何用自带的功能将线段变成铜皮操作指导。勾选Convert to shape,需要把这段走线变成铜皮。

weixin_54787054的博客 2946

.NET中的弱引用

弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么。强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用。例如: 1 Cat cat = new Cat(); 变量cat就是一个强引用,它指向了堆中的一个Cat对象实例。我们都知道,CLR的垃圾回收机制会标记所有被强引用到的对象,而那些剩下的未被标记的对象则会被垃圾回收。换句话说,如果一个对象一直被某个...

weixin_30940783的博客 166

【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

文章目录2.1 使用VBA进行桌面软件开发2.1.1 VBA开发方式2.1.1 VBA代码的安全性2.2 使用DLL进行桌面软件开发2.2.1 DLL开发方式2.2.2 DLL功能的应用部署2.3 使用Add-in进行桌面软件开发2.4 使用ArcGIS Engine构建独立应用程序 对于桌面GIS应用来说,ArcGIS平台不仅提供了用于开发独立运行的GIS应用软件的二次开发工包ArcGIS Engine,还提供了对ArcGIS Deskop桌面软件进行扩展的开发的话,在开发个具体的GIS 行业应用软件时

智慧空间实验室 6509

可食用野生植物检测实战:基于YOLOv11的智能识别系统全流程指南

本文介绍了一种基于YOLOv11的可食用野生植物智能识别系统。该系统通过深度学习技术,能在0.2秒内精准识别植物是否可食用,准确率高达92%。文章详细阐述了从数据采集、标注到模型训练、验证的全流程,并开发了用户友好的Tkinter交互界面。该系统解决了户外探险和植物研究中植物识别的痛点,具有高精度、实时性和强泛化能力的特点,为户外安全提供了智能化解决方案。

FJN110的博客 164

WeakReference 学习和使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak reference的理解和

成功不必在我,而功力必不唐捐! 1574

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

泛型弱引用(不继承 System.WeakReference)

代码publicclassWeakReference<T>:IDisposable{privateGCHandlehandle;privatebooltrackResurrection;publicWeakReference(Ttarget):this(target,false){}p...

weixin_34261415的博客 346

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

不只是给面试加分 -- Java WeakReference的理解与使用

前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存...

全是干货 1979

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

对WeakReference的理解

如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference

一个字 2815

弱引用WeakReference作用与使用场景

在分析threadLocal源码时,发现有使用弱引用WeakReference,在之前总结GC的时候,也曾简单介绍java引用类型(《jvm GC算法类型》第6节),本文在详细总结下WeakReference的使用方法。 java4种引用类型: 强:A a=new A(); 此时引用a强引用对象A;不会被GC 软:SoftReference.java,在内存不够时引用对象会被GC; 弱:Weak...

雨剑的博客 1万+

C#中的弱引用(WeakReference)

我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。弱引用可以让您保持对对象的引用,同时允许GC在必要时释放对象,回收内存。对于那些创建便宜但耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。弱引用使...

weixin_30654419的博客 704

谈谈java中的WeakReference

java语言中为对象的引用分为了四个级别,分别为 强引用 、软引用、弱引用、虚引用。 本文只针对java中的弱引用进行一些分析,如有出入还请多指正。 在分析弱引用之前,先阐述一个概念:什么是对象可到达和对象不可到达状态。 其实很简单,我举个例子: 现在有如下两个类class A class B,在JVM上生成他们两个类的实例分别为 instance a  instance b 有如下表达

Matrixxu博客专栏 6万+

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 310

11-01-演进-.NET GC发展史

.NET GC发展史映射硬件演进:从单核STW到多核并发,再到区域化细粒度回收。历经分代管理、ServerGC、BackgroundGC、LOH自动压缩、POH隔离、DATC自适应线程数及Region-based管理等关键革新,代码量从5000行增至4万+,复杂度指数上升。每一步优化均在暂停时间、吞吐量与资源开销间权衡,体现“实用主义”哲学。核心启示:GC演进由硬件驱动,方向明确——更短暂停、更高效率,但代价是工程复杂性持续攀升。

设计 AI 玩游戏🎮 368
上一篇: 深度揭秘.NET中Lambda表达式的编译机制:高效编程与性能优化
下一篇: 深度解析.NET中HttpClient的连接管理机制:优化网络请求性能
步步为营DotNet
博客等级 码龄1年 295粉丝 287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值