java垃圾回收机制解惑

Java的垃圾回收机制详解和调优大全 立即下载

一、谁在做Garbage Collection?

  一种流行的说法:在C++里,是系统在做垃圾回收;而在Java里,是Java自身在做。

  在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存。这是流行的说法。确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了。这个要求,对编码者来说,是件很麻烦、很难做到的事。随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题。

  Java采用一种不同的,很方便的方法:Garbage Collection.垃圾回收机制放在JVM里。JVM完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关心空间回收问题。

  二、对象在啥时被丢弃?

  在C++里,当对象离开其作用域时,该对象即被应用抛弃。

  是对象的生命期不再与其作用域有关,而仅仅与引用有关。

  Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。

  一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。

  这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。

  JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。

  三、丢弃就被回收?

  该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。

  但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。假如每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统的运转效率非常低下。

  前面说过,JVM的垃圾回收机制有多个算法。除了引用计数法是用来判定对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。

  因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。切记垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。

  四、没有引用变量指向的对象有用吗?

  前面说了,没挂上引用变量的对象是被应用丢弃的,这意味着,它在堆空间里是个垃圾,随时可能被JVM回收。

  不过,这里有个不是例外的例外。对于一次性使用的对象(有些书称之为临时对象),可以不用引用变量指向它。举个最简单也最常见的例子:

  System.out.println(“I am Java!”);

  就是创建了一个字符串对象后,直接传递给println()方法。

  五、应用能干预垃圾回收吗?

  许多人对Java的垃圾回收不放心,希望在应用代码里控制JVM的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM.第一个前面已经说了,就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法System.gc(),多数书里说调用它让Java做垃圾回收。

  第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作轻易发生,或提早发生,或回收较多而已。

  希望JVM及时回收垃圾,是一种需求。其实,还有相反的一种需要:在某段时间内最好不要回收垃圾。要求运行速度最快的实时系统,非凡是嵌入式系统,往往希望如此。

  Java的垃圾回收机制是为所有Java应用进程服务的,而不是为某个特定的进程服务的。因此,任何一个进程都不能命令垃圾回收机制做什么、怎么做或做多少。

  六、对象被回收时要做的事

  一个对象在运行时,可能会有一些东西与其关连。因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在finalize()方法(常称之为终止器)里。

  protected void finalize()

  {

  // finalization code here

  }

  这个终止器的用途类似于C++里的析构函数,而且都是自动调用的。但是,两者的调用时机不一样,使两者的表现行为有重大区别。C++的析构函数总是当对象离开作用域时被调用。这就是说,C++析构函数的调用时机是确定的,且是可被应用判知的。但是,Java终止器却是在对象被销毁时。由上所知,被丢弃的对象何时被销毁,应用是无法获知的。而且,对于大多数场合,被丢弃对象在应用终止后仍未销毁。

  在编码时,考虑到这一点。譬如,某对象在运作时打开了某个文件,在对象被丢弃时不关闭它,而是把文件关闭语句写在终止器里。这样做对文件操作会造成问题。假如文件是独占打开的,则其它对象将无法访问这个文件。假如文件是共享打开的,则另一访问该文件的对象直至应用终结仍不能读到被丢弃对象写入该文件的新内容。

  至少对于文件操作,编码者应认清Java终止器与C++析构函数之间的差异。

  那么,当应用终止,会不会执行应用中的所有finalize()呢?据BrUCe Eckel在Thinking in Java里的观点:“到程序结束的时候,并非所有收尾模块都会得到调用”。这还仅仅是指应用正常终止的场合,非正常终止呢?

  因此,哪些收尾操作可以放在finalize()里,是需要酌酎的。

Java文件流关闭和垃圾回收问题 .wps 立即下载

相关推荐

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 952

JVM垃圾回收和调优实践

JVM垃圾回收 YGC、OldGC、FullGC区别和联系 区别 YGC ->Minor GG:发生在年轻代的GC OldGC -> Major GC:发生在老年代的GC FullGC -> Full GC:发生在年轻代、老年代、方法区的GC(方法区VS持久代:方法区是JVM规范,持久代是方法区的实现,jdk8后方法区由本地内存实现) ​ ...

jiangqingqingqing的专栏 1185

你不必懂AI,但必须会用AI:写给所有焦虑中的职场人

AI时代不必焦虑学技术,关键在于用AI解决实际问题。文章指出,99%的人只需成为AI使用者而非建造者,核心竞争力在于结合业务痛点运用AI工具提升效率。与其盲目学习工具,不如梳理工作流程,识别可优化环节,让AI赋能重复性、标准化任务。行业经验与AI工具的结合才是真正的职场护城河。建议从具体工作场景出发,寻找匹配的AI解决方案,迈出应用第一步。

hundred98的博客 718

JVM垃圾回收调优:原理、策略与性能提升

垃圾回收(GC)调优是优化 Java 应用性能的关键步骤,主要目标是减少 ​​(Stop-the-World)、提升 ​​(Throughput)或降低 ​。

m0_74665582的博客 834

nRF52840 低功耗蓝牙开发指南:从硬件架构到物联网应用实战

本文深入解析nRF52840低功耗蓝牙芯片的硬件架构与开发实践,涵盖从开发环境搭建到BLE协议栈开发的详细指南。通过实战案例分享低功耗优化技巧,帮助开发者高效实现物联网应用,特别适合智能家居和工业场景。

d3e4f的博客 419

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 106

JVM学习-垃圾回收专题+GC调优

三个阶段循环进行:当伊甸园被占满时会触发垃圾回收,同时也会触发STW;幸存的对象会以复制的算法放到幸存区(对应示意图中E->S);当一个幸存区内存不足时则会再次触发垃圾回收,寿命达到阈值的会将其放入老年代中(对应示意图中S->O),其他寿命不足的则会复制到其他幸存区中(对应示意图中S->S)。新生代在垃圾回收时会进行初始标记,标记那些根对象,当老年代的内存占用达到阈值时,则会进行并发标记。并发标记完成后会先进行最终标记,类似于CMS的重新标记,也会触发STW;

qq_65568592的博客 1464

人工智能训练师三级考试题型全解析|190道真题样例+30天备考路线

人工智能训练师三级考试并不神秘:理论考190道选择题(刷题就能过),实操考代码+方案设计(练练就会)。核心是花时间——30天系统备考,足以从容通过。如果你想从零开始系统备考,覆盖所有考点和实操技能,欢迎查看我的专栏:📖《人工智能训练师三级·从零到拿证完全指南》80篇系统化内容,覆盖报名、备考、冲刺、拿证全流程六大模块知识点逐个击破,每个考点都讲透实操代码题手把手教学,附带完整参考代码高频考点速记 + 易错题精讲 + 3套模拟试卷30天备考计划 + 冲刺复习策略。

白话机器学习 6086

GoLand GC(垃圾回收机制)简介及调优

GC(Garbage Collector)垃圾回收机制简介、go内存耗用查看及gc参数调整内存优化

qq_42824983的博客 1486

Yolo11改进:Block改进|MixDehazeNet,用于图像去雾网络的混合结构块|即插即用|附代码

https://arxiv.org/pdf/2305.17654 图像去雾是低级视觉领域中的一项典型任务。先前的研究验证了大型卷积核和注意力机制在去雾中的有效性。然而,存在两个缺点:引入大型卷积核时容易忽略图像的多尺度特性,而注意力模块的标准串联方式没有充分考虑雾分布的不均匀性。在本文中,我们提出了一种名为混合结构图像去雾网络(MixDehazeNet)的新型框架,该框架解决了上述两个问题。具体而言,它主要由两部分组成:多尺度并行大型卷积核模块和增强并行注意力模块。与单个大型卷积核相比,多尺度的并行大型卷积

m0_47867638的博客 1275

【AI智能体】全场景AI智能体工作台WorkBuddy实战操作详解

全场景AI智能体工作台WorkBuddy实战操作详解

congge 5528

垃圾回收调优

自适应调整大小策略 主要调整新生代的内存 大小,动态调整伊甸园区和幸存者区域的大小 以及 对象晋升到老年代的寿命。的吞吐量下降,总的暂停时间就会变长。即就是在程序运行期间,垃圾回收的时间占程序运行时间的大小。采用并行垃圾回收器 前面是的新生代gc 后面是老年代gc。单位时间内回收垃圾的量。设置并行gc线程数量。........................................................................

m0_71149992的博客 1054

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4572

Java的垃圾回收机制

本篇文章主要整理一下自己学习和了解到的关于Java垃圾回收机制的一些知识。欢迎各位Coder交流。

qq_40413725的博客 9686

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java中的垃圾回收机制

垃圾回收器的组合关系虽然很多,但是针对几个特定的版本,比较好的组合选择如下:JDK8及之前:ParNew + CMS(关注暂停时间)、Parallel Scavenge + Parallel Old (关注吞吐量)、 G1(JDK8之前不建议,较大堆并且关注暂停时间)JDK9之后:G1(默认)从JDK9之后,由于G1日趋成熟,JDK默认的垃圾回收器已经修改为G1,所以强烈建议在生产环境上使用G1。

lingyaol的博客 3067

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java垃圾回收机制

综合了若干人的blog~1. 垃圾回收的意义  在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空

zsuguangh的专栏 15万+

Java垃圾回收机制与垃圾收集器

Java中的垃圾回收机制以及垃圾收集器详解

愿你我都能实现自己的梦想 2517

JAVA垃圾回收机制

通过自动垃圾回收算法对堆内存中 new出的且不再被引用的对象 进行回收

weixin_53975556的博客 9752

【JAVA】JAVA的垃圾回收机制详解

对于Java的垃圾回收机制,它是Java虚拟机(JVM)提供的一种自动内存管理机制,主要负责回收不再使用的对象以释放内存空间。需要注意的是,全局变量的生命周期与整个应用程序的生命周期相同,因此如果全局变量引用的对象一直存在于内存中而不被释放,可能会造成内存泄漏。因此,在使用全局变量时要合理管理其生命周期,确保不再需要时及时释放,以减少内存占用和提高系统性能。

代码的魅力,根本走不出来 1867

【Java】垃圾回收机制

(GC Roots)回收区域Java 堆(新生代 + 老年代)、方法区(部分)常用算法复制、标记-清除、标记-整理分代策略不同对象生命周期使用不同策略提升效率收集器Serial、CMS、G1、ZGC 等,适配不同场景。

weixin_46589153的博客 1078

图解Java 垃圾回收机制

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。垃圾回收机制的引入有效地解决了内存的回收问题使得他们在编写程序的时候不再需要考虑内存管理。本文首先着重介绍了判断一个对象是否可以被回收的两种经典算法,并详述了四种典型的垃圾回收算法的基本思想及其直接应用——垃圾收集器,最后结合内存回收策略介绍了内存分配规则。

Rico's Blogs 8万+

Java 垃圾回收机制

Java 垃圾回收机制一、垃圾回收的意义二、垃圾回收机制中的算法1. 1 可达性检测算法1.1.1 引用计数法(`Reference Counting Collector`)1.1.2 根搜索算法(`可达性分析算法`)1.2 垃圾收集算法1.2.1 标记-清除(Mark-Sweep)算法1.2.2 复制(Copying)算法1.2.3 标记-整理(Mark-Compact)算法1.2.4 分代收集(Generational Collection)算法(比较常用)三、垃圾收集器(GC)四、四种引用状态 一、垃

weixin_43520450的博客 1610

java垃圾回收机制

一、什么是垃圾回收机制 java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是垃圾回收回收的是无任何引用的对象占据的内存空间,而不是对象本身。真正的垃圾回收机制不是立马回收,具体在什么时间开始是不确定的,这和抢占式的线程在发生作用时的原理一样。 二、关于在讲解垃圾回收时会用到的一些概念 1.强制垃圾回收。由于程序无法

NEU_tt的博客 2358
上一篇: 信号量浅析
下一篇: 做了个关于字符串处理的题
java05
博客等级 码龄18年 21粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值