在Java程序的生命周期中,Java运行环境提供了一个系统的垃圾回收器线程,负责自动回收那些没有被引用的对象所占用的内存,这种清除无用对象进行内存回收的过程就叫作垃圾回收 (garbage collection)。Java提供自动内存回收的功能,可以让程序员减轻许多内存管理的负担,同时也减少犯错的机会。

当一个对象被创建时,JVM会为该对象分配一定的内存、调用该对象的构造方法并开始跟踪该对象。当该对象停止使用时,JVM将通过垃圾回收器回收该对象所占用的内存。那Java是如何知道一个对象是无用的呢?

这是因为系统中的任何对象都有一个引用计数器,一个对象被引用1次,则该对象的引用计数器为1,被引用2次,则引用计数器为2;相反,若对一个对象减少1次引用,则该对象的引用计数器就减1,依次类推,当一个对象的引用计数器减到0时,说明该对象可以回收。


垃圾回收的好处:

  1. 它把程序员从复杂的内存追踪、监测、释放等工作中解放出来。
  2. 它防止了系统内存被非法释放,从而使系统更加稳定。

垃圾回收的特点:

(1)只有当一个对象不被任何引用类型的变量使用时,它占用的内存才可能被垃圾回收器回收。

如下面的程序段:

String str1="This is a string";
String str2 = str1;
str1 = null;
str2 = new String("This is another string");

当程序执行到第3行时,“This is a string” 对象仍然被 str2 引用,因此,此时不能被垃圾回收器回收。当程序执行完第4行,str2 引用了一个新的字符串对象,此时"This is a string"对象不在被任何引用类型的变量(str1和str2)引用,此时该对象可以被当作垃圾回收。

(2)不能通过程序强迫垃圾回收器立即执行

垃圾回收器负责释放没有引用与之关联的对象所占用的内存,但是回收的时间对程序员是透明的,在任何时候,程序员都不能通过程序强迫垃圾回收器立即执行,但可以通过调用System.gc()或者Runtime.gc() 方法提示垃圾回器进行内存回收操作,不过这也不能保证调用该方法后,垃圾回收器立即执行。

(3)当垃圾回收器将要释放无用对象占用的内存时,先调用该对象的 finalize() 方法。

在Java语言中对象的回收是由系统进行的,但有一些任务需要在回收时进行,如清理一些非内存资源、关闭打开的文件等。这可通过覆盖对象中的finalize()方法来实现,因为系统在回收时会自动调用对象的finalize()方法。

finalize()方法的形式如下:

protected void finalize()throws Throwable

由于只有当垃圾回收器将要释放该对象的内存时,才会执行该对象的finalize()方法,如果在程序退出之前,垃圾回收器始终没有执行释放内存的操作,那么垃圾回收器将不会调用无用对象的finalize()方法。换句话说,假如一个程序只占用了少量的内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。

显然,如果程序员为某个对象定义了finalize()方法,JVM可能不会调用它,因为垃圾回收器不曾释放过这个对象的内存,调用System.gc()也不会起作用,因为它仅仅是给JVM一个建议而不是命令。当一个对象将要退出生命周期时,可以通过finalize()方法来释放对象所占的其他相关资源,但是,JVM有很大的可能不调用对象的finalize()方法,因此很难保证使用该方法来释放资源是安全有效的。


感谢大家的耐心阅读,如有建议请私信或评论留言

浅谈Java垃圾回收相关推荐

  1. 浅谈c#垃圾回收机制(GC)

    写了一个window服务,循环更新sqlite记录,内存一点点稳步增长.三天后,内存溢出.于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servicestack.ormlite ...

  2. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  3. java stw_快速理解Java垃圾回收和jvm中的stw

    Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外).Java中一种全局暂停现象,全局停顿,所有Java代码停 ...

  4. 浅谈Java多线程机制

    浅谈Java多线程机制 (-----文中重点信息将用红色字体凸显-----) 一.话题导入 在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度. ...

  5. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

  7. ​浅谈 Java 后端开发工程师腾讯面试经历分享总结

    最近一段时间考虑到换工作,打算整理一下网络上曾经面试者分享的的面试经历并结合自己以往的面试经历和经验,帮助大家获取到互联网大厂的入职通知书,也就是入职 offer. 本文整理网络面试者和本人的面试经历 ...

  8. 细谈JVM垃圾回收与部分底层实现

    JVM系列文章目录 初识JVM 深入理解JVM内存区域 玩转JVM对象和引用 JVM分代回收机制和垃圾回收算法 细谈JVM垃圾回收与部分底层实现 Class文件结构及深入字节码指令 玩转类加载和类加载 ...

  9. [JVM]成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信一个 ...

  10. 理解 Java 垃圾回收机制

    理解java垃圾回收机制有什么好处呢?作为一个软件工程师,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java应用程序. 这是我个人的主观观点,但我相信一个 ...

最新文章

  1. day3----str常用操作方法
  2. mysql每个类型查三条_Mysql的几个灵魂拷问(三)
  3. Java集合 LinkedList的原理及使用
  4. Linkedin Camus的使用
  5. ADO.NET- 基础总结及实例
  6. linux搭建vsftp服务器_Linux配置VSFTP服务器的方法
  7. 【乘风破浪的开发者】华为云云享专家胡琦:快快使用ModelArts,零基础也能玩转AI!
  8. linux下ftp相关的一些指令
  9. linux游戏专用系统下载官网,经典游戏操作系统(Batocera.linux)
  10. 【夏虫语冰】visio2013安装出错,无法打开注册表,错误码1402
  11. 什么是 0day 漏洞,1day 漏洞和 nday 漏洞?
  12. 奥克兰计算机科学专业世界排名,2021年度QS世界大学学科排名发布!奥克兰理工大学特色专业盘点...
  13. pointer在html作用,详解pointer-events属性的使用
  14. 计算机T层,层螺旋计算机断层摄影术及T磁共振成像对-国家心血管病中心.PDF
  15. electron 11 win10 全屏透明窗口是不透明
  16. ArcGIS+百度地图API:制作杭州市边界shp文件
  17. 【图像融合】基于非下采样剪切波变换(NSST)实现红外图像和可见光图像融合matlab代码
  18. matlab的lambda,lambda算法matlab
  19. 数据归档,存储的完美储备军
  20. 金蝶天燕加入阿里云原生合作伙伴计划并发布金融行业服务治理联合解决方案

热门文章

  1. 正态分布某一点的概率怎么算_标准正态分布+标准正态分布概率表+分布函数+积分...
  2. wps for linux字体缺失,wps for linux 字体库缺失问题的解决办法
  3. 解读国密非对称加密算法SM2
  4. 香橙派python编程_香橙派Orange Pi 4开发板在Ubuntu系统下使用python 控制GPIO
  5. 检测计算机无线网卡驱动,win10怎么修复无线网卡驱动 无线网卡驱动修复方法
  6. html弹窗复制,js复制弹窗美化
  7. c语言校时程序,我校C语言程序设计教与学的思考
  8. Python机器学习:基于西瓜数据集的KNN算法实现
  9. liteide+g:Goland多版本管理
  10. 【STM32】 JR6001语音播放