首页/新闻资讯/正文详情

jvm中的强软弱虚4种引用类型与gc的关系

发布时间:2026/11/5 7:57:53 来源:云帆数科 栏目:资讯中心
jvm中的强软弱虚4种引用类型与gc的关系
目录强引用--不进行回收软引用--内存不足的时候进行回收弱引用--发现即回收虚引用--跟踪垃圾回收默认情况下通过System.gc()或者Runtime.getRuntime().gc()的调用会显示触发Full GC同时对老年代和年轻代进行回收。强引用--不进行回收使用 new 关键字创建出来的。软引用--内存不足的时候进行回收软引用是用来描述一些还有用但非必需的对象。只被软引用关联着的对象在系统将要发生内存溢出异常前会把这些对象列进回收范围之中进行第二次回收如果这次回收还没有足够的内存才会抛出内存溢出异常。软引用通常用来实现内存敏感的缓存。比如:高速缓存就有用到软引用。如果还有空闲内存就可以暂时保留缓存当内存不足时清理掉这样就保证了使用缓存的同时不会耗尽内存。垃圾回收器在某个时刻决定回收软可达的对象的时候会清理软引用并可选地把引用存放到一个引用队列(Reference Queue)。类似弱引用只不过Java虚拟机会尽量让软引用的存活时间长一些迫不得已才清理。通过SoftReference创建SoftReferenceUser softReference new SoftReferenceUser(new User(1,zhang_san)); System.gc(); System.out.println(GC之后打印\n softReference.get() softReference.get()); try { //让系统认为内存资源紧张、不够 byte[] b new byte[7168 * 1024]; } catch (Exception e) { throw new Exception(e); } finally { //再次从软引用中获取数据 System.out.println(创建了大对象之后重新获取 softReference.get() softReference.get()); }设置vm options参数如下-Xms10m -Xmx10m -XX:PrintGCDetails执行测试程序后出现oomgc之前打印 softReference.get() [id1, namezhang_san] GC之后打印 softReference.get() [id1, namezhang_san] 创建了大对象之后重新获取 softReference.get() null弱引用--发现即回收弱引用也是用来描述那些非必需对象只被弱引用关联的对象只能生存到下一次垃圾收集发生为止。在系统GC时只要发现弱引用不管系统堆空间使用是否充足都会回收掉只被弱引用关联的对象。由于垃圾回收器的线程通常优先级很低因此并不一定能很快地发现持有弱引用的对象。在这种情况下弱引用对象可以存在较长的时间。弱引用和软引用一样在构造弱引用时也可以指定一个引用队列当弱引用对象被回收时就会加入指定的引用队列通过这个队列可以跟踪对象的回收情况。弱引用非常适合来保存那些可有可无的缓存数据。如果这么做当系统内存不足时这些缓存数据会被回收不会导致内存溢出。而当内存资源充足时这些缓存数据又可以存在相当长的时间从而起到加速系统的作用。WeakReferenceUser weakReference new WeakReference(new User(1, li_si)); System.out.println( gc之前打印 weakReference.get()); System.gc(); System.out.println( gc 之后 weakReference.get());打印结果gc之前打印 [id1, nameli_si] gc 之后null补充python语言也有垃圾回收同时支持引用计数和垃圾收集机制。java没有使用引用计数算法存在难题--循环引用问题python使用了引用计数如何解决的手动解除在合适的时机解除引用关系使用弱引用weakref,weakref是Python提供的标准库旨在解决循环引用。虚引用--跟踪垃圾回收也称为幽灵引用或者幻影引用是所有引用类型中最弱的一个。一个对象是否有虚引用的存在完全不会决定对象的生命周期。如果一个对象仅持有虚引用那么它和没有引用几乎是一样的随时都可能被垃圾回收器回收。它不能单独使用也无法通过虚引用来获取被引用的对象。当试图通过虚引用的get()方法取得对象时总是null为一个对象设置虚引用关联的唯一目的在于跟踪垃圾回收过程比如:能在这个对象被收集器回收时收到一个系统通知。虚引用必须和引用队列一起使用。虚引用在创建时必须提供一个引用队列作为参数。当垃圾回收器准备回收一个对象时如果发现它还有虚引用就会在回收对象后将这个虚引用加入引用队列以通知应用程序对象的回收情况。由于虚引用可以跟踪对象的回收时间因此也可以将一些资源释放操作放置在虚引用中执行和记录。终结器引用(Final reference)它用以实现对象的finalize()方法也可以称为终结器引用。无需手动编码其内部配合引用队列使用。在GC时终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法第二次GC时才能回收被引用对象。#补充 finalize()#finalize的作用(1)finalize()与C中的析构函数不是对应的。C中的析构函数调用的时机是确定的(对象离开作用域或delete掉)但Java中的finalize的调用具有不确定性(2)不建议用finalize方法完成非内存资源的清理工作但建议用于:1清理本地对象(通过JNI创建的对象):2作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。#finalize的问题(1)一些与finalize相关的方法由于一些致命的缺陷已经被废弃了如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法(2)System.gc()与System.runFinalization()方法增加了finalize方法执行的机会但不可盲目依赖它们(3)]ava语言规范并不保证finalize方法会被及时地执行、而且根本不会保证它们会被执行(4)finalize方法可能会带来性能问题。因为JVM通常在单独的低优先级线程中完成finalize的执行(5)对象再生问题:finalize方法中可将待回收对象赋值给GC Roots可达的对象引用从而达到对象再生的目的(6)finalize方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法但并不影响GC对finalize的行为)

相关推荐

小白程序员轻松入门大模型,AI大数据开发工程师进阶指南
小白程序员轻松入门大模型,AI大数据开发工程师进阶指南

本文深入剖析AI大数据开发工程师的核心能力与岗位需求,对比传统大数据工程师,指出Spark/Flink等基础技能已不再是优势。文章详细解析了三类典型岗位(业务型、模型导向型、AI数据基础设施工程师)的选拔逻辑,并总结了企业… · 2026/11/5 7:57:53

FHE层级
FHE层级

全同态加密的概念同态:密文计算的结果解密后,等于明文计算的结果。即 Dec(Enc(a)⊕Enc(b))ab全同态:支持任意深度的加法和乘法运算(不仅是单一操作,而且可以无限次组合)。第一层:密码学基础与底… · 2026/11/5 7:57:53

从印尼商标抢注到印尼商标续展:印尼公司注册前后,印尼法律顾问要盯住的六个关键节点
从印尼商标抢注到印尼商标续展:印尼公司注册前后,印尼法律顾问要盯住的六个关键节点

内容摘要:印尼商标制度在2026年完成流程重排与官费上调,执行层每个节点都换了参数。本文按检索、公证、提交、公告、实审、续展六个节点拆解印尼商标全流程的必备输入与常见退回原因,覆盖印尼商标抢注处置、印尼公司注册衔接与印尼法律顾问配… · 2026/11/5 7:57:53

UCOS-II多任务与系统时钟实战:嵌入式课程设计避坑指南
UCOS-II多任务与系统时钟实战:嵌入式课程设计避坑指南

简介:这份资源是面向嵌入式专业学生与初学者的UCOS-II课程设计完整工程,围绕多任务调度与系统时钟展开,可用于课程实验、自学练手或作为RTOS入门的参考项目。压缩包共63个文件、约283KB,以35个h头文件、3个c源文件为核心代码&… · 2026/11/5 8:12:00

阿童木机器人港股冲刺:服务机器人行业商业逻辑解析
阿童木机器人港股冲刺:服务机器人行业商业逻辑解析

1. 阿童木机器人港股冲刺背后的商业逻辑 阿童木机器人近期披露的招股书显示,这家服务机器人企业在9个月内实现了1.57亿元营收,但净利润仅有94万元。这个看似矛盾的数据背后,藏着服务机器人行业怎样的生存法则?作为联想基金和车好多… · 2026/11/5 8:12:00

冥府技术体系架构:业力计算与轮回调度系统解析
冥府技术体系架构:业力计算与轮回调度系统解析

1. 冥府技术体系架构解析 在冥府技术团队中,我们建立了一套融合硅谷工程文化与东方玄学智慧的技术架构。这套系统需要处理每秒数百万级的因果事件,同时保证六道轮回的绝对公平性。作为从阳间晋升而来的技术管理者,我深刻理解两个世界的技术差… · 2026/11/5 8:12:00

OpenClaw技能库:提升开发效率的即插即用解决方案
OpenClaw技能库:提升开发效率的即插即用解决方案

1. 项目概述OpenClaw "Skills军火库"是一个专注于收集和整理各类OpenClaw技能的精选资源库。这个项目类似于一个数字化的工具箱,里面装满了各种可以直接拿来使用的"技能武器"。作为一名长期关注自动化工具和效率提升的技术从业者,我… · 2026/11/5 8:12:00

小公司如何高效利用大模型API降低成本
小公司如何高效利用大模型API降低成本

1. 为什么小公司应该避开大模型训练微调 去年接触过一家20人规模的AI创业团队,他们花了三个月时间和80%的研发预算在LLaMA模型微调上,结果做出的客服机器人还不如直接调用GPT-3.5的API效果好。这个案例很典型——当前阶段,模型训练和微调就像… · 2026/11/5 8:12:00

智能推荐算法在全屋定制系统中的应用与实践
智能推荐算法在全屋定制系统中的应用与实践

1. 项目背景与核心价值全屋定制行业近年来呈现爆发式增长,消费者对个性化家居解决方案的需求与日俱增。传统定制流程存在方案匹配度低、设计周期长、沟通成本高等痛点。这个毕业设计项目正是瞄准这一市场缺口,通过智能推荐算法重构线上定制流程。我在实际… · 2026/11/5 8:11:00

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码