- P1第1课:实战演示JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory等
- P3第3课:图解JVM线程引擎和内存共享区的交互及此背景下的程序计数器内幕解密
- P4第4课:10分钟内图解掌握全世界最易懂的JVM内存模型内幕
- P5第5课:实战演示JVM三大性能调优参数:-Xms -Xmx -Xss
- P6第6课:实战演示从OOM推导出JVM GC时候基于的内存结构:Young Generation(Eden、From、To)、Old Generation、Per
- P7第7课:瞬间理解JVM GC时的内存管理工作流程和频繁GC的原因
- P8第8课:JVM的Young Generation大小对GC性能的致命影响力内幕解密
- P9第9课:JVM的GC时候核心参数详解:-XX:NewRatio、-XX:SurvivorRatio、-XX:NewSize、-XX:MaxNewSize
- P10第10课:JVM的GC中关于对象的Age问题以及JVM的内存分配策略彻底详解
- P11第11课:JVM的GC日志Young Generation下Minor GC每个字段彻底详解
- P12第12课:JVM的GC日志Full GC每个字段彻底详解
- P13第13课:Java 8中的JVM的MetaSpace解密
- P14第14课:Java对象内存逃逸技术
- P15第15课:GC时候的引用计数算法和根搜索算法
- P16第16课:瞬间理解三种基本的GC算法基石
- P17第17课:JVM垃圾回收分代收集算法
- P18第18课:JVM垃圾回收器串行、并行、并发垃圾回收器概述
- P19第19课:JVM中Serial收集器、ParNew收集器、Parallel收集器解析
- P20第20课:JVM中CMS收集器解密
- P21第21课:JVM中G1收集器解密
- P22第22课:通过案例瞬间理解JVM中PSYoungGen、ParOldGen、MetaSpace
- P23第23课:使用MAT对Dump文件进行分析实战
- P24第24课:使用MAT动态分析Spark应用程序初体验
- P25第25课:基于MAT分析Shallow Heap和Retained Heap
- P26第26课:MAT中的Dominator Tree与Retained Set详解
- P27第27课:MAT中的GC Root解析和具体类别分析
- P28第28课:MAT中的内存泄露检测介绍
第二步
因为有引用,所以可以调方法
线程如何访问全局内存——先拷贝到线程
绿色:线程私有
橙色:公有
Direct Memory:谁分配谁有拥有这个内容;
Java 虚拟机枚举 GC Roots 解析JVM 堆内存模型镇楼。 读《深入理解Java 虚拟机》第三章GC算法,关于 GC Roots 枚举的段落没说透彻,理解上遇到困惑。因此对这点进行扩展并记录,发现国内各种博客写来写去都是几乎相同的分析,还是没厘清困惑:GC Roots 究竟是如何枚举的,其中用到的 OopMap 是一个什么样的数据结构? Recap:三大GC算法1、标记清除算法(Mark-Sweep) 2、复制算法(Copying) 3、标记整理算法(Mark-Compact) 三种算法都用到了可达性分析方法来对对象进行标记清除。 可达性分析方法分三大步骤:Step One: Enumerations of Roots. 找到瓜藤的根。 Step Two: Marking all object references starting from the roots. 从根节点出发,顺藤摸瓜,每次摸到一个瓜,就打上标记--这瓜还没熟,别摘! Step Three: Sweeping all the unmarked objects. 瓜熟蒂落,那些没被标记上的瓜自然就是熟了的瓜,统统收走拿去吃掉。 以上过程对应的伪代码如下:
疑问点:什么是根节点 GC Roots?For your application code to reach an object, there should be a root object which is connected to your object as well as capable of accessing from outside the heap. Such root objects that are accessible from outside the Heap are called Garbage Colllection (GC) roots. There are several types of GC roots such as Local variables, Active Java threads, Static variables, JNI References etc. (Just take the ideology here, if you do a quick google search, you may find many conflicting classifications of GC roots) 对于一个 Java 程序而言,对象都位于堆内存块中,存活的那些对象都被根节点引用着,即根节点 GC Roots 是一些引用类型,自然不在堆里,那它们位于哪呢?它们能放在哪呢? 答案是放在栈里,包括: Local variables 本地变量 Static variables 静态变量 JNI References JNI引用等 GC Roots are objects that are themselves referenced by the JVM and thus keep every other object from being garbage-collected.如何快速枚举 GC Roots? 1、笨方法:遍历栈里所有的变量,逐一进行类型判断,如果是 Reference 类型,则属于 GC Roots。 2、高效方法:从外部记录下栈里那些 Reference 类型变量的类型信息,存成一个映射表 -- 这就是 OopMap 的由来。 “在解释执行时/JIT时,记录下栈上某个数据对应的数据类型,比如地址1上的”12344“值是一个堆上地址引用,数据类型为com.aaaa.aaa.AAA) 现在三种主流的高性能JVM实现,HotSpot、JRockit和J9都是这样做的。其中,HotSpot把这样的数据结构叫做 OopMap,JRockit里叫做livemap,J9里叫做GC map。” GC 时,直接根据这个 OopMap 就可以快速实现根节点枚举了。 参考链接: |
|