川石教育
全国咨询热线:136-9172-9932
  1. 首页 > 资讯与干货 > IT资讯

性能测试—JVM GC是怎么判断对象可以被回收呢?

作者:川石学院 日期:2021-05-08 17:50:01 点击数:

  性能测试过程中所谓的GC回收就是回收一些不用的内存,因为程序在运行过程中,这些对象运行结束后都得释放出来,这些对象释放后,就必须对这些内在进行回收。如果不能有效的加收这些内存就可以导致内存溢出的问题。

  那么JVM GC是怎么判断对象可以被回收了呢?通常可以通过以下情况来判断对象是否可以被回收。

  1) 对象没有被引用。

  2) 作用域发生未捕获到的异常信息。

  3) 程序在作用域正常执行完毕。

  4) 程序执行了system.exit的方法。

  5) 程序出现异常意外终止。

  关于如何判断垃圾的算法通常会有两种:引用计数法和可达性分析算法。

  1) 引用计数法

  引用计数法是为每个对象添加一个计数器,相当于一个变量用来计算对象引用和回收的情况,当该对象被引用时计数器就会加1,如图10-23所示,当引用失效时计数器减1。最后判断对象计数器是否为0,如果对象计数器为0,那么表示这个对象可以回被回收。但引用计数法有一个缺点,这个无法循环使用。  

性能测试—JVM GC是怎么判断对象可以被回收呢?(图1)

  图10-23 计数器增加

  先创建一个字符串,String str = new String("shenzhen");,这时候 " shenzhen " 有一个引用,就是str。然后将str设置为null,这时候 " shenzhen " 的引用次数就等于 0 了,在引用计数算法中,意味着这块内容就需要被回收了。  

性能测试—JVM GC是怎么判断对象可以被回收呢?(图2)

  图10-24 引用计数器释放对象

  1) 可达性分析算法

  关于如何判断垃圾的算法通常会有两种:引用计数法和可达性分析算法。

  在Java中,是通过可达性分析(Reachability Analysis)来判定对象是否存活的。该算法的思路是通过以GC ROOT对象作为搜索起始点向下搜索,搜索经过的路径称之为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。则这个对象是可以回收的,如图10-25所示。  

性能测试—JVM GC是怎么判断对象可以被回收呢?(图3)

  图10-25 GC Root

  如上图所示,Object1到object5这五个对象是可以到达GC Root的,说明不需要回收,但是Object6、Object7和Object8对GC Root节点不可达,说明这三个对象是可以被回收。

  但即使对象不可以到达GC Root也不一定就立即确定对象一定能回收,对象最终是否被回收,必须由finalize()方法来确定,finalize()方法Object类中定义的,每个类可以重写这个方法,但一般不建议对这个方法进行重写,因为这个方法在调用时存在太多的不确定性。

  要确定对象是否真的被回收,需要finalize()方法进行两次标记,第一次标记并进行一次筛选,筛选对象是否有必要执行finalize()方法,当对象没有覆盖finalize方法,或者finzlize方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”,对象被回收。

  如果该对象被判定为必须执行finalize()方法,那么这个对象就会被放置在一个名为F-Queue的队列之中,并会在由虚拟机自动建立的、低优先级的Finalizer线程中执行,即在虚拟机中触发这个方法,然后GC会对F-Queue队列中的对象进行第二次标记,如果对象被第二次标记,那么这个对象就会被回收了。如果在finalize()中没有被第二次标记,那么就只要重新与引用链上的任何一个对象建立关联即可。

  本章节关于“GC回收的机制”的内容就学习完了,大家喜欢的话记得每天来这里和小编一起学习涨薪技能哦。(笔芯)

  下一章预告:“垃圾收集算法”


相关文章
  • 亚马逊运营成功转行软件测试,薪资13K表示很满意!2021-05-08 17:50:01
  • 西安川石的兰朋友喊你来当他的学弟学妹啦!2021-05-08 17:50:01
  • 国外的月亮也不一定比国内测试猿的年薪美~2021-05-08 17:50:01
  • 建筑工程专业朱同学成功转行为软件测试人!2021-05-08 17:50:01
  • 财务管理专业转行软件测试月薪甩会计几条街!2021-05-08 17:50:01
  • 只有技术沉淀才能成功上岸,深圳就业薪资13K!2021-05-08 17:50:01
  • 薪资11K!实现自我价值,从掌握一门IT技术开始...2021-05-08 17:50:01
  • 文科生转行软件测试照样拿下高薪15K!2021-05-08 17:50:01
  • 恭喜罗同学喜提19.5K,成功入行软件测试!2021-05-08 17:50:01
  • 毕业1年,迷茫的他最终选择转行软件测试2021-05-08 17:50:01