JVM 垃圾回收
普通网友
这个作者很懒,什么都没留下…
展开
-
JVM G1 垃圾回收 源码阅读03 ConcurrentMark && ConcurrentRefine
g1ConcurrentMark.cppG1并发标记Stack的初始化1.先验证这个G1CMMarkStack是否已经初始化了2.计算出最大chunk容量3.然后计算出初始化容量,也就是initial_chunk_capacity4.校验初始容量小于等于最大容量5.调用resize 重新设置大小分配一个新的chunk1.判断hwm大于chunk_capacity,就直接返回null2.获取cur_idx大小,校验不能大于chunk_capacity3.按照大小原创 2020-06-19 22:38:53 · 307 阅读 · 0 评论 -
JVM 三色标记法 读写屏障
https://blog.csdn.net/qq_21383435/article/details/106311542首先:CMS和G1都使用了三色标记法关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。无论使用哪种算法,标记总是必要的一步。这是理算当然的,你不先找到垃圾,怎么进行回收?垃圾回收器的工作流程大体如下:能标记的都是可用的,未标记的都是垃圾标记出哪些对象是存活的原创 2020-06-17 23:48:24 · 1142 阅读 · 0 评论 -
JVM G1 垃圾回收 源码阅读02 RememberSet
创建一个当前collection的top快照,然后筛除掉那些我们不想扫描的card mark增加一个dirty_region1.判断该入参region已经dirty,就直接return2.如果不是,就利用底层的cmpxchg指令,来把这个region标记为dirty3.标记region为dirty成功后,就分配对应的空间大小 allocated,然后把入参region放进去清除卡表中的dirty region1.判断如果不存在dirty region,就直接return..原创 2020-06-13 18:17:26 · 534 阅读 · 0 评论 -
JVM G1 垃圾回收 源码阅读01 CollectionSet
collectionSetChooser.cppG1垃圾回收器,把内存分成了一个个HeapRegion,所以这里按照每个HeapRegion的垃圾回收效率gc_efficiency进行排序1.首先去掉不适用的portion原创 2020-06-09 23:15:53 · 565 阅读 · 0 评论 -
ZGC 源码分析 转载
https://hg.openjdk.java.net/jdk/jdk12/file/06222165c35f/src/hotspot/share/gc3.2 ZGC的特性并发由于停顿时间小于10ms,显而易见的,回收周期绝大部分逻辑将于Mutator并发执行。基于区域与G1类似,JAVA Heap被划分为多个Region,但ZGC中Region大小并不唯一。压缩算法为了避免内存碎片,需要在回收周期中进行压缩。支持NUMA作为下一代垃圾回收算法,支持NUMA是必须的。使用c原创 2020-06-05 15:13:30 · 661 阅读 · 0 评论 -
JVM CMS 源码分析
为什么 Old Gen 使用占比仅 50% 就进行了一次 CMS GC? Metaspace 的使用也会触发 CMS GC 吗? 为什么 Old Gen 使用占比非常小就进行了一次 CMS GC触发条件CMS GC 在实现上分成 foreground collector 和 background collector。foreground collector 相对比较简单,background collector 比较复杂,情况比较多。下面我们从 foreground collector 和 bac原创 2020-06-03 21:48:54 · 605 阅读 · 0 评论 -
JVM G1 源码分析02 新生代回收 && 混合回收 && full gc
YGC的流程如下:首先STW,YGC全过程都在STW时进行,不需要考虑并发场景选择CSet(Collection Set),YGC中CSet即为全部新生代Region根扫描更新RSet深度复制更新对象到Survivor Region重构RSet释放CSet大对象回收动态扩展内存动态调整新生代Region数量启动并发标记,判断是否需要紧接着进行一次混合式GCGC并行任务包括跟扫描、更新RSet、对象复制,主要逻辑在g1CollectedHeap.cpp G1ParTask类的w.原创 2020-06-02 17:35:06 · 446 阅读 · 0 评论 -
JVM G1 源码分析01 分区 && 空间分配 && RememberSet && DirtyCard
HR的大小影响分配和回收的效率,HR过大则回收消费的时间长,HR过小则导致对象内存分配较慢且内存利用率较低。HR大小上下限定义在heapRegionBounds中,最小1MB,最大32MB。HR的size必须是2的幂次,即仅可为1MB、2MB、4MB、8MB、16MB、32MB。JVM参数-XX:G1HeapRegionSize可以指定HR size,如果未指定,JVM根据实际情况动态决定。HR数量默认为2048。计算HR size的逻辑主要在setup_heap_region_siz...原创 2020-06-02 14:26:07 · 921 阅读 · 0 评论 -
JVM 源码分析14 Object.wait/notify
Object作为java中所有对象的基类,其存在的价值不言而喻,其中wait和notify方法的实现多线程协作提供了保证。前提:由同一个lock对象调用wait、notify方法。1、当线程A执行wait方法时,该线程会被挂起;2、当线程B执行notify方法时,会唤醒一个被挂起的线程A;lock对象、线程A和线程B三者是一种什么关系?根据上面的结论,可以想象一个场景:1、lock对象维护了一个等待队列list;2、线程A中执行lock的wait方法,把线程A保存到list中;3、线程B中原创 2020-05-23 09:14:31 · 167 阅读 · 0 评论 -
JDK12中新版垃圾回收器-Shenandoah GC
Shenandoah是一款concurrent及parallel的垃圾收集器;跟ZGC一样也是面向low-pause-time的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现。其实低停顿的GC,业界早就出现,只不过Java比较晚Azul的Zing中C4 GC土豪选择oracle中的HotSpot ZGCJDK11的选择R大说ZGC说抄袭Azul的,两者是等价的。不过今天主要是探究一下...原创 2020-05-22 21:50:57 · 559 阅读 · 0 评论 -
G1 对比 CMS
https://www.jianshu.com/p/bdd6f03923d1原创 2020-06-03 21:20:02 · 371 阅读 · 0 评论 -
JVM 源码分析13 跨代引用cardTable && System.gc
思考一个问题,在进行YGC时,如果young generation的Y对象被old generation中O对象引用,那么称O对象存在跨代引用,而且Y对象应该在本次垃圾回收中存活下来,所以old generation的对象在YGC时也是Strong root的一部分,如果每次YGC都去扫描old generation中所有对象的话,肯定会非常耗时,那么有什么好的解决方案呢?如果只扫描那些有...原创 2020-04-21 22:52:53 · 516 阅读 · 0 评论 -
JVM 源码分析12 YGC 深入分析
数组动态扩容导致频繁FGC参数:-XX:CMSScavengeBeforeRemark含义:Enable scavenging attempts before the CMS remark step.开启或关闭在CMS重新标记阶段之前的清除(YGC)尝试CMS并发标记阶段与用户线程并发进行,此阶段会产生已经被标记了的对象又发生变化的情况,若打开此开关,可在一定程度上降低CMS重新标记阶...原创 2020-04-21 22:43:40 · 979 阅读 · 1 评论 -
JVM 源码分析11 安全点 && TLAB
源码分析之安全点safepoint一直都知道,当发生GC时,正在执行Java code的线程必须全部停下来,才可以进行垃圾回收,这就是熟悉的STW(stop the world)然而这一切的一切,都涉及到一个概念safepoint,openjdk的实现位于openjdk/hotspot/src/share/vm/runtime/safepoint.cpp什么是safepointsa...原创 2020-04-19 23:31:51 · 203 阅读 · 0 评论 -
JVM 源码分析10 垃圾回收03 老年代垃圾回收
老年代TenuredGeneration的垃圾回收算法实现第一种:标记清除它是最基础的收集算法。原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提...原创 2020-04-17 15:19:48 · 392 阅读 · 0 评论 -
JVM 源码分析09 垃圾回收02
新生代DefNewGeneration的实现内存初始化实现 分别通过EdenSpace和ContiguousSpace类实现新生代的eden和from to区域,(其中Contiguous是"连续"的意思,表示一块连续的内存空间),其中EdenSpace在实现上是继承自ContiguousSpace的。1、如果_eden_space、_from_space、_to_sp...原创 2020-04-17 14:55:23 · 425 阅读 · 0 评论 -
JVM 源码分析08 垃圾回收01
通过执行VMOperationQueue_lock->wait方法等待VM operation.step 2JVM源码分析之垃圾收集的执行过程参数说明:1、参数full标识是否需要进行full gc;2、参数clear_all_soft_refs标识gc过程中是否需要清除软引用;...原创 2020-04-16 22:48:03 · 277 阅读 · 0 评论 -
JVM 源码分析06
JVM源码分析之堆内存的初始化堆初始化Java堆的初始化入口位于Universe::initialize_heap方法中,实现如下:其中UseParallelGC、UseG1GC、UseConcMarkSweepGC都可以通过启动参数进行设置,整个初始化过程分成三步:1、初始化GC策略;2、初始化分代生成器;3、初始化Java堆管理器;GC策略初始化HotSpot...原创 2020-04-13 22:17:42 · 171 阅读 · 0 评论 -
Java 新垃圾回收器深入学习 ZGC 02
ZGC(Z Garbage Collector)是一款由Oracle公司研发的,以低延迟为首要目标的一款垃圾收集器。它是基于动态Region内存布局,(暂时)不设年龄分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的收集器。在JDK 11新加入,还在实验阶段,主要特点是:回收TB级内存(最大4T),停顿时间不超过10ms。小型Region(Small Region)...原创 2020-04-12 23:09:00 · 200 阅读 · 0 评论 -
Jvm 优化实践
1.使用本地缓存 优化一、商品信息非必要的缓存字段去掉,减少内存占用如上,自定义缓存结构实现了以下几点:(1)LRU的缓存策略:保证缓存项个数不会超过maxSize(2)数据的及时更新,发布数据最多不会超过2min(1min+1min)就会被及时拉到;通过定时器定时更新数据(3)高并发时并不会对远端服务造成压力,除了第一次建立缓存时多个请求会产生多次远...原创 2020-04-26 13:01:18 · 70 阅读 · 0 评论 -
JVM 知识点01
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的...原创 2020-04-17 15:16:27 · 55 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 第10章 && 第11 章
为了实现STW,JVM设计了安全点10.2 G1 并发线程进入安全点 G1新引入的线程都是自己主动让出CPU进入暂停 用join判断VMThread是否发出了进入安全点的请求,如果VMThread发出了请求,则并发线程在此等待。 leave 发现VMThread 发出进入安全点的请求后,通知VMThread检查是否需要继续等待,因为...原创 2020-01-13 22:21:30 · 371 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 第8章 && 第9章
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++第9章 G1的新特性 字符串去重 从jdk7 update6 开始,每个String 对象都有一个自己专属的私有字符数组char[] ,这个字符数组在JVM内部使用typeArrayOOp表...原创 2020-01-12 22:01:49 · 194 阅读 · 1 评论 -
JVM G1源码分析和调优书 阅读笔记 第7章 Full GC
对象分配失败,就会进入到Evac失败过程,在GC日志详情中会打印相关信息1.处理失败2.再次尝试分配,仍然不成功,进行Full GC7.1 Evac失败 把对象放入到Evac失败栈;直接更新对象的RSet,不需要对已复制的对象做额外回收之类的处理检查是否有指向自己的指针,如果有,就代表发生了复制失败。需要删除指针,恢复对象头 1. 把这个分配失败的对象,放入到特殊的d...原创 2020-01-11 21:00:06 · 384 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 二
第3章 G1的对象分配线程的私有缓冲区,不是线程栈空间TLAB 过小会导致不停地分配新的TLAB,如果TLAB 过大,会导致内存碎片问题。JVM 提供了参数TLABSize来控制TLAB的大小,JVM会自己推断这个值多大更合适,设置TLAB占用Eden空间的百分比...原创 2019-12-24 22:53:42 · 266 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第5章 ZGC 垃圾回收算法实现
ZGC 垃圾回收分为10个步骤5.1.1 初始标记 从根集合出发,标记根集合所有引用的对象,以这些对象作为第2步并发标记的出发点。 如果不STW,只有并发标记,应用程序线程发生在标记线程之前,也就是应用线程根本不知道需要标记老对象,导致漏标 初始标记中,仅把根集合直接引用的对象,找出来作为并发标记的输入。这样造成STW足够短 ...原创 2020-01-28 22:00:24 · 494 阅读 · 3 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第4章 ZGC 垃圾回收算法设计
4.1 并发垃圾回收 4.1.1 并发垃圾回收概述 标记:从根集合出发,标记活跃对象; 转移 : 活跃对象转移到新内存,原来的内存就可以回收 重定位 :对象内存地址变化,所有指向对象老地址的指针就要调整到对象新地址上 4.1.2 ZGC 并发算法 1.初始标记,再次标记,初始转移(转移根对象...原创 2020-01-28 18:13:27 · 319 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第3章 ZGC 线程
ZGC 后台线程 3.1 ZGC的线程 JavaThread :要执行Java代码的线程 CompilerThread : 执行JIT的线程 NameThread : JVM 内部使用的线程 VMThread :JVM执行垃圾回收的线程 ConcurrentGCThread :并发执行垃...原创 2020-01-28 17:59:46 · 335 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第2章 ZGC 内存管理
为了支持TB级内存,设计了基于页面 page的分页管理,类似于G1的分区Region为了能够快速地并发标记和并发移动,对内存空间重新进行了划分,这就是ZGC 引入的颜色指针Color Pointers;同时ZGC为了能更加高效地管理内存,设计了物理内存和虚拟内存两级内存管理2.1 操作系统地址管理 程序试图访问一个虚拟内存页面时,这个请求会通过操作系统来访问真正的内存;也...原创 2020-01-18 15:36:39 · 225 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第1章 垃圾回收器概述
垃圾回收算法: 引用计数法: 给对象分配一段额外的空间,用于维护一个计数器,对象增加了一个新的引用,则增加计数器的值。一个引用关系失效,则减少计数器的值。但是需要解决循环依赖的问题可达性分析法: 通过根集合作为起始点,根据引用关系开始搜索。JVM中常见的根有线程栈帧,符号表,字符串表,对象监视器,元数据对象。 并发执行垃圾回收器: CMS,G1,ZGC,Sh...原创 2020-01-16 21:32:57 · 540 阅读 · 0 评论 -
CMS 垃圾回收图解
最近在整理JVM相关的PPT,把CMS算法又过了一遍,每次阅读源码都能多了解一点,继续坚持。什么是CMSCMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代使用CMS垃圾回收器,需要添加虚拟机参数-"XX:+UseConcMarkSweepGC"。使用场景:GC过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间的...原创 2020-01-05 20:42:15 · 84 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 五 第6章 混合回收
6.1 并发标记算法 用Prev指针指向上一次并发处理后的地址,用Next指向并发标记开始之前内存已经分配成功的地址。并发标记结束后,只需要把Prev指针设置为Next指针,即可开始新一轮的标记处理。 并发标记引入两个位图 PrevBitMap 和 NextBitMap ,来指示哪块内存已经使用,哪块未使用 PrevBitMap 记录prev指针之前内存...原创 2020-01-03 22:55:00 · 197 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 四
第5章 新生代回收因为Obj5 引用 Obj2,并且Obj2已经被复制,所以直接更新Obj5 指向Obj2的指针即可,指向到新复制的空间Obj3引用了Obj6, 所以也需要把Obj6 复制到新空间...原创 2020-01-01 22:09:11 · 219 阅读 · 1 评论 -
JVM G1源码分析和调优书 阅读笔记 三
第4章 G1的refine线程RSet直接记录对象的地址,带来的问题是RSet会急剧膨胀 G1 回收器里面,使用了Point In 的方法,算法可以简化为找到需要收集的分区HeapRegion集合,所以YGC 扫描 RootSet 和 RSet就可以了RSet 管理引用的方式,把引用者对象对应的卡表地址存放在RSet中,在Rset里面记录一个区域到这个对象...原创 2019-12-25 22:34:37 · 262 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 一
G1 垃圾回收器 分区 Heap Region,下限是1MB,上限是32MB,默认整个堆空间分为2048个分区region1.通过G1HeapRegionSize可以指定大小,默认值为02.不指定region大小,由G1启发式推断HR大小 ---- 根据堆空间最大值和最小值,以及HR的个数进行推断如果G1 是启发式推断新生代的大小,扩张时如果有空闲的分区列表,就直接加入到新生代分区列表...原创 2019-12-22 21:36:01 · 1122 阅读 · 0 评论 -
JVM 知识点 01
在Java中主要有以下三种类加载器: 引导类加载器(bootstrap class loader) --用来加载java的核心库(String,Integer,List......)在jre/lib/rt.jar路径下的内容。使用c代码来实现的,并不继承自java.lang.ClassLoader. --加载扩展类加载器和应用程序加载器,并指定他们的父类...原创 2019-09-23 09:46:43 · 84 阅读 · 0 评论 -
知识点复习03 JVM03
加载 ,验证,准备,解析,初始化,使用,卸载ArrayBlockingQueue使用较少,一使用LinkedBlokingQueue和SynchronousQueue。线程池排队策率与BlockingQueue有关threadFactory:线程工厂,主要用来创建线程;hander:表示当拒绝处理任务时的策率,有一下四种取值:ThreadPoolExecutor.AbortPoli...原创 2019-10-06 15:06:07 · 151 阅读 · 0 评论 -
知识点复习02 JVM02
Java并发编程 Synchronized及其实现原理Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥地访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:1、普通同步方法,锁是当前实例...原创 2019-10-05 15:22:01 · 80 阅读 · 0 评论 -
知识点复习01 JVM01
JAVA中的几种基本类型,各占用多少字节String能被继承吗?为什么?不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。平常我们定义的String str=”a”;其实和String str=new String(“a”)还是有差异的。##String, Stringbuffer, StringBuilder 的区别。Stri...原创 2019-10-05 15:21:43 · 115 阅读 · 0 评论 -
Java 新垃圾回收器深入学习 ZGC 01
GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析。同时还对还对这一新功能带来的其他可能性做了展望。ZGC是否可以达到该性能目标,请看高可用架构志愿者翻译的文章。Java 11的新功能已经完全冻结,其中有些功能绝对非常令人兴奋,本文着重介绍ZGC。Java 11包含一个全新的垃圾收集器–ZGC,它由Or...原创 2019-12-08 16:26:57 · 260 阅读 · 0 评论