背景:

之前面试阿里支付宝,被问到常见的GC Root 是什么?
当时自己支支吾吾,明明自己看过深入理解Java 虚拟机这本书,但是就是回答不上来。

后来自己工作中,遇到内存泄漏问题。我百度,下载了MAT,去分析内存泄漏。问题很简答就处理完了。
但是,我只是使用了MAT 工具。 对于GC Root 都有什么还是什么都不懂,内存泄漏问题也是尝试着去解决。
并没有特别有信心。

Java 垃圾回收机制

Java 垃圾回收机制,一般使用GC Root 可达性分析算法,去判断一个对象是否可以被回收。
可达性,也就是这个对象的引用连是否和GC Root 相连。那么关键就是,什么是GC Root?
搜索了很多博客,都讲得不清楚。后来果断去google 搜索。果然结果令人满意:

Garbage Collection Roots

A garbage collection root is an object that is accessible from outside the heap. The following reasons make an object a GC root:System Class
Class loaded by bootstrap/system class loader. For example, everything from the rt.jar like java.util.* .JNI Local
Local variable in native code, such as user defined JNI code or JVM internal code.JNI Global
Global variable in native code, such as user defined JNI code or JVM internal code.Thread Block
Object referred to from a currently active thread block.Thread
A started, but not stopped, thread.Busy Monitor
Everything that has called wait() or notify() or that is synchronized. For example, by calling synchronized(Object) or by entering a synchronized method. Static method means class, non-static method means object.Java Local
Local variable. For example, input parameters or locally created objects of methods that are still in the stack of a thread.Native Stack
In or out parameters in native code, such as user defined JNI code or JVM internal code. This is often the case as many methods have native parts and the objects handled as method parameters become GC roots. For example, parameters used for file/network I/O methods or reflection.Finalizable
An object which is in a queue awaiting its finalizer to be run.Unfinalized
An object which has a finalize method, but has not been finalized and is not yet on the finalizer queue.Unreachable
An object which is unreachable from any other root, but has been marked as a root by MAT to retain objects which otherwise would not be included in the analysis.Java Stack Frame
A Java stack frame, holding local variables. Only generated when the dump is parsed with the preference set to treat Java stack frames as objects.Unknown
An object of unknown root type. Some dumps, such as IBM Portable Heap Dump files, do not have root information. For these dumps the MAT parser marks objects which are have no inbound references or are unreachable from any other root as roots of this type. This ensures that MAT retains all the objects in the dump.

以上,就是一些比较常见的GC Root 对象。其实也好理解。

Java Local  本地变量表,如果执行到某个方法的时候,进行了垃圾回收,那么方法里面的局部变量引用的对象是不能被回收的。
不然怎么继续执行程序? 同样,JNI Local 也是一样的。
Busy Monitor 正在使用的锁对象,肯定不能被回收,不然影响程序运行。
Thread Block 线程里面的变量,一个活着的线程里面的对象肯定不能被回收。
System Class  被系统classloader 加载的类,引用的对象肯定不能回收。比如:rt.jar 里面的一些对象。
总之一句话,GC Root 对象一定是影响程序运行的对象。

分析具体问题:

用MAT 打开.hprof 文件,点击Leak Suspects:

如下图,它会分析出几个问题,我们点开一个看下:

按照下图的方法,我们查看下这个Fragmet 到GC Root 的引用链,去掉软弱引用,因为这些不影响垃圾回收。

我们看到,这个Fragment 被 HightLighter 的 mInserAdListener 引用,HightLighter 这个类又被Native Stack 引用,导致Fragment泄漏。

解决方法:

因为当gc 内存回收的时候,会去回收HightLighter 这个类,但是这个了类被Native 引用,所以回收不了。但是这个类还引用了一个Fragment,其实这个Fragment onDestory 之后,不应该被这个HightLighter 引用了。
那么:
当Fragment 关闭的时候,这个HightLighter 类的 成员变量mInserAdListener 不应该再引用Fragment 了。
把这个mInserAdListener 置为空,不引用Fragment 就行了。

参考资料:

推荐阅读 https://help.eclipse.org/oxygen/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html

英文的:
https://www.dynatrace.com/resources/ebooks/javabook/how-garbage-collection-works/

eclipse 的,比较好:
https://help.eclipse.org/oxygen/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html

ibm 的,比较好:
https://www.ibm.com/support/knowledgecenter/en/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/gcroots.html

MAT 使用官方文档,写的超级好,比博客里面写得好:
https://help.eclipse.org/oxygen/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Fconcepts%2Fgcroots.html

比较不错的,说了大概
https://yq.aliyun.com/articles/91017?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&2017531&utm_content=m_22117

带图的,看的清晰一点:
https://blog.csdn.net/KyleYang2016/article/details/79459050

一般:
https://www.cnblogs.com/jeffwongishandsome/p/talk-about-GC-and-how-to-use-GC-better.html

总结:

1.我觉得,应该抓住工作中每一个学习新知识的机会。我觉得是,不应该只是简单的解决问题。而应该抓住解决问题 带来的弥补自己知识盲点的机会,提升自己。

Java 垃圾回收机 GC Roots详解(Garbage Collection Roots)相关推荐

  1. JAVA垃圾回收机制GC之我姐是明星

    JAVA垃圾回收机制GC(Garbage Collection) 工作面试老伙伴之java垃圾回收机制 什么是GC,为什么要GC(我的明星老姐) 判断垃圾(找到不常穿的衣服) A 引用计数算法 B 可 ...

  2. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

  3. JVM垃圾回收算法与原理详解

    垃圾回收 参考文档 GC参考手册-Java版 理解Java的强引用.软引用.弱引用和虚引用 JVM系列(五) - JVM垃圾回收算法 如何判断对象可以回收 引用计数法 参考文章 Java JVM的引用 ...

  4. JVM 垃圾回收算法及回收器详解

    本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Python是 ...

  5. java垃圾回收算法超详细全解

    目录 一.开始 垃圾标记阶段:对象存活判断 垃圾清除阶段 二.垃圾标记阶段算法--引用计数法 循环引用 证明java未使用引用计数算法 小结 三.垃圾标记阶段算法--可达性分析算法(根搜索算法.追踪性 ...

  6. Java垃圾回收(GC)、找垃圾的方式、GC Root、GC停顿、引用、垃圾收集算法、收集器、GC日志、安全点、安全区域

    1.垃圾回收 1.1概念 在Java语言中,垃圾回收(Garbage Collection,GC)是一个非常重要的概念. 它的主要作用是回收程序中不再被使用的内存,Java提供的GC功能可以自动监测对 ...

  7. java 程序执行后 强制gc_快速理解Java垃圾回收奥秘(GC)

    引子 说到虚拟机的垃圾回收机制,学过JVM的同学可能都略知一二.Eden.Survivor.Minor GC.G1这个名词萦绕耳边,但往往又无法详细的描述清楚,下面我们就GC的原理做一些讲解,清晰的记 ...

  8. python垃圾回收机制原理_详解python的垃圾回收机制

    python的垃圾回收机制 一.引子 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式 ...

  9. java 垃圾回收机制GC

    1.GC的作用取 2.什么是GC JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代. 因此GC按照回收的区域又分了两种类型,一种是普通GC(minor GC), ...

最新文章

  1. 一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...
  2. 如何成功地在亚洲植入敏捷和DevOps
  3. 一个简单的XML文档例子
  4. Ubuntu下配置Apache的Worker模式
  5. 将三个数按从大到小输出
  6. java怎么复制别人的数据库_数据库实现主从复制
  7. 在eclipse中修改spark2.1源码
  8. rabbitmq安装erlang,报错configure: error: /bin/sh ‘/app/otp_src_20.2/erts/configure‘ failed for erts
  9. linux c硬盘序列号,linux下获得硬盘序列号的c源代码
  10. 易语言源码翻译c,易语言编写翻译小工具源码
  11. 云计算技术,主要包含哪些关键技术?
  12. pads生成bom表
  13. 关于2440嵌入式MPlayer播放器的移植方法
  14. Alpha、Beta、RC、GA版本的区别
  15. jq多选按钮值_jQuery实现获取选中复选框的值实例详解
  16. php tinyme_各个版本的Linux系统介绍
  17. Python数据分析常用的类库
  18. docker tag详解
  19. 都说MES能提高企业生产效率,具体表现在哪些方面呢?
  20. Proteus:单片机按键控制流水灯方向

热门文章

  1. 用java编写运行的小游戏_第一次用Java编写小游戏!
  2. C++知识点40——运算符的重载概念与分数类实现(中)
  3. 计算机编码技术ppt,计算机编码技术.ppt
  4. cheked复选框返回值的时候选中
  5. Spring Boot 2.x整合Websocket(基于Spring Boot 2.x 前后端分离 iview admin vue 集成activiti工作流...
  6. Micropython教程之TPYBoard开发板DIY智能温控小风扇(萝卜学科编程教育)
  7. WebView的截屏实现
  8. Java API —— Collections类
  9. 【C/C++学院】(27)项目实战HttpServer--原理分析
  10. CentOS 7无线网卡驱动解决方法