![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
普通网友
这个作者很懒,什么都没留下…
展开
-
CMS 垃圾回收图解
最近在整理JVM相关的PPT,把CMS算法又过了一遍,每次阅读源码都能多了解一点,继续坚持。什么是CMSCMS全称 Concurrent Mark Sweep,是一款并发的、使用标记-清除算法的垃圾回收器,如果老年代使用CMS垃圾回收器,需要添加虚拟机参数-"XX:+UseConcMarkSweepGC"。使用场景:GC过程短暂停,适合对时延要求较高的服务,用户线程不允许长时间的...原创 2020-01-05 20:42:15 · 85 阅读 · 0 评论 -
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 · 319 阅读 · 0 评论 -
JVM 三色标记法 读写屏障
https://blog.csdn.net/qq_21383435/article/details/106311542首先:CMS和G1都使用了三色标记法关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。无论使用哪种算法,标记总是必要的一步。这是理算当然的,你不先找到垃圾,怎么进行回收?垃圾回收器的工作流程大体如下:能标记的都是可用的,未标记的都是垃圾标记出哪些对象是存活的原创 2020-06-17 23:48:24 · 1149 阅读 · 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 · 541 阅读 · 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 · 667 阅读 · 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 · 631 阅读 · 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 · 449 阅读 · 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 · 925 阅读 · 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 · 170 阅读 · 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 · 523 阅读 · 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 · 988 阅读 · 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 · 206 阅读 · 0 评论 -
JVM 源码分析10 垃圾回收03 老年代垃圾回收
老年代TenuredGeneration的垃圾回收算法实现第一种:标记清除它是最基础的收集算法。原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提...原创 2020-04-17 15:19:48 · 406 阅读 · 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 · 432 阅读 · 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 · 281 阅读 · 0 评论 -
JVM 源码分析07 CAS 底层实现
这里只是举了一个例子, 也许这个例子也不太恰当, 本文只是列出了这个api的调用方法而已, 重点在于介绍compareAndSet()方法的底层原理. 调用的是unsafe里面的compareAndSwapInt()方法刚刚跑去取介绍了getUnsafe()方法...接下来继续讲解cas...刚才说到了AtomicBoolean类里的compareAndSet()方法内部其实...原创 2020-04-16 22:31:47 · 186 阅读 · 0 评论 -
JVM 源码分析06
JVM源码分析之堆内存的初始化堆初始化Java堆的初始化入口位于Universe::initialize_heap方法中,实现如下:其中UseParallelGC、UseG1GC、UseConcMarkSweepGC都可以通过启动参数进行设置,整个初始化过程分成三步:1、初始化GC策略;2、初始化分代生成器;3、初始化Java堆管理器;GC策略初始化HotSpot...原创 2020-04-13 22:17:42 · 178 阅读 · 0 评论 -
JVM 源码分析05
JVM源码分析之Java类的加载过程背景最近对Java细节的底层实现比较感兴趣,比如Java类文件是如何加载到虚拟机的,类对象和方法是以什么数据结构存在于虚拟机中?虚方法、实例方法和静态方法是如何调用的?本文基于openjdk-7的OpenJDK实现Java类在HotSpot的内部实现进行分析。HotSpot内存划分在HotSpot实现中,内存被划分成Java堆、方法区、Java栈...原创 2020-04-12 19:02:55 · 274 阅读 · 0 评论 -
JVM 源码分析04 synchronized
JVM源码分析之java对象头实现HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头对象头包括两部分:Mark Word 和 类型指针。Mark WordMark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。类型...原创 2020-04-12 13:40:37 · 143 阅读 · 0 评论 -
JVM 源码分析03
深入分析Object.finalize方法的实现原理finalize如果类中重写了finalize方法,当该类对象被回收时,finalize方法有可能会被触发,下面通过一个例子说明finalize方法对垃圾回收有什么影响。FinalizerThread线程负责从ReferenceQueue队列中获取Finalizer对象,如果队列中没有元素,则通过wait方法将该线程挂...原创 2020-04-11 00:24:45 · 165 阅读 · 0 评论 -
JVM 源码分析02 G1垃圾回收
G1垃圾收集算法主要应用在多CPU大内存的服务中,在满足高吞吐量的同时,竟可能的满足垃圾回收时的暂停时间,该设计主要针对如下应用场景:垃圾收集线程和应用线程并发执行,和CMS一样 空闲内存压缩时避免冗长的暂停时间 应用需要更多可预测的GC暂停时间 不希望牺牲太多的吞吐性能 不需要很大的Java堆GC模式G1中提供了三种模式垃圾回收模式,young gc、mixed g...原创 2020-04-08 23:14:36 · 462 阅读 · 0 评论 -
JVM 源码分析01 环境安装 代码编译
https://www.jianshu.com/p/2394abce3f03https://github.com/codefollower/OpenJDK-Research原创 2020-04-07 23:22:33 · 91 阅读 · 0 评论 -
Jvm 优化实践
1.使用本地缓存 优化一、商品信息非必要的缓存字段去掉,减少内存占用如上,自定义缓存结构实现了以下几点:(1)LRU的缓存策略:保证缓存项个数不会超过maxSize(2)数据的及时更新,发布数据最多不会超过2min(1min+1min)就会被及时拉到;通过定时器定时更新数据(3)高并发时并不会对远端服务造成压力,除了第一次建立缓存时多个请求会产生多次远...原创 2020-04-26 13:01:18 · 75 阅读 · 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 · 58 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第3章 ZGC 线程
ZGC 后台线程 3.1 ZGC的线程 JavaThread :要执行Java代码的线程 CompilerThread : 执行JIT的线程 NameThread : JVM 内部使用的线程 VMThread :JVM执行垃圾回收的线程 ConcurrentGCThread :并发执行垃...原创 2020-01-28 17:59:46 · 348 阅读 · 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 · 93 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 五 第6章 混合回收
6.1 并发标记算法 用Prev指针指向上一次并发处理后的地址,用Next指向并发标记开始之前内存已经分配成功的地址。并发标记结束后,只需要把Prev指针设置为Next指针,即可开始新一轮的标记处理。 并发标记引入两个位图 PrevBitMap 和 NextBitMap ,来指示哪块内存已经使用,哪块未使用 PrevBitMap 记录prev指针之前内存...原创 2020-01-03 22:55:00 · 204 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 四
第5章 新生代回收因为Obj5 引用 Obj2,并且Obj2已经被复制,所以直接更新Obj5 指向Obj2的指针即可,指向到新复制的空间Obj3引用了Obj6, 所以也需要把Obj6 复制到新空间...原创 2020-01-01 22:09:11 · 223 阅读 · 1 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第5章 ZGC 垃圾回收算法实现
ZGC 垃圾回收分为10个步骤5.1.1 初始标记 从根集合出发,标记根集合所有引用的对象,以这些对象作为第2步并发标记的出发点。 如果不STW,只有并发标记,应用程序线程发生在标记线程之前,也就是应用线程根本不知道需要标记老对象,导致漏标 初始标记中,仅把根集合直接引用的对象,找出来作为并发标记的输入。这样造成STW足够短 ...原创 2020-01-28 22:00:24 · 503 阅读 · 3 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第4章 ZGC 垃圾回收算法设计
4.1 并发垃圾回收 4.1.1 并发垃圾回收概述 标记:从根集合出发,标记活跃对象; 转移 : 活跃对象转移到新内存,原来的内存就可以回收 重定位 :对象内存地址变化,所有指向对象老地址的指针就要调整到对象新地址上 4.1.2 ZGC 并发算法 1.初始标记,再次标记,初始转移(转移根对象...原创 2020-01-28 18:13:27 · 325 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第2章 ZGC 内存管理
为了支持TB级内存,设计了基于页面 page的分页管理,类似于G1的分区Region为了能够快速地并发标记和并发移动,对内存空间重新进行了划分,这就是ZGC 引入的颜色指针Color Pointers;同时ZGC为了能更加高效地管理内存,设计了物理内存和虚拟内存两级内存管理2.1 操作系统地址管理 程序试图访问一个虚拟内存页面时,这个请求会通过操作系统来访问真正的内存;也...原创 2020-01-18 15:36:39 · 242 阅读 · 0 评论 -
新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第1章 垃圾回收器概述
垃圾回收算法: 引用计数法: 给对象分配一段额外的空间,用于维护一个计数器,对象增加了一个新的引用,则增加计数器的值。一个引用关系失效,则减少计数器的值。但是需要解决循环依赖的问题可达性分析法: 通过根集合作为起始点,根据引用关系开始搜索。JVM中常见的根有线程栈帧,符号表,字符串表,对象监视器,元数据对象。 并发执行垃圾回收器: CMS,G1,ZGC,Sh...原创 2020-01-16 21:32:57 · 556 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 第10章 && 第11 章
为了实现STW,JVM设计了安全点10.2 G1 并发线程进入安全点 G1新引入的线程都是自己主动让出CPU进入暂停 用join判断VMThread是否发出了进入安全点的请求,如果VMThread发出了请求,则并发线程在此等待。 leave 发现VMThread 发出进入安全点的请求后,通知VMThread检查是否需要继续等待,因为...原创 2020-01-13 22:21:30 · 376 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 第8章 && 第9章
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++第9章 G1的新特性 字符串去重 从jdk7 update6 开始,每个String 对象都有一个自己专属的私有字符数组char[] ,这个字符数组在JVM内部使用typeArrayOOp表...原创 2020-01-12 22:01:49 · 200 阅读 · 1 评论 -
JVM G1源码分析和调优书 阅读笔记 第7章 Full GC
对象分配失败,就会进入到Evac失败过程,在GC日志详情中会打印相关信息1.处理失败2.再次尝试分配,仍然不成功,进行Full GC7.1 Evac失败 把对象放入到Evac失败栈;直接更新对象的RSet,不需要对已复制的对象做额外回收之类的处理检查是否有指向自己的指针,如果有,就代表发生了复制失败。需要删除指针,恢复对象头 1. 把这个分配失败的对象,放入到特殊的d...原创 2020-01-11 21:00:06 · 390 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 三
第4章 G1的refine线程RSet直接记录对象的地址,带来的问题是RSet会急剧膨胀 G1 回收器里面,使用了Point In 的方法,算法可以简化为找到需要收集的分区HeapRegion集合,所以YGC 扫描 RootSet 和 RSet就可以了RSet 管理引用的方式,把引用者对象对应的卡表地址存放在RSet中,在Rset里面记录一个区域到这个对象...原创 2019-12-25 22:34:37 · 266 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 二
第3章 G1的对象分配线程的私有缓冲区,不是线程栈空间TLAB 过小会导致不停地分配新的TLAB,如果TLAB 过大,会导致内存碎片问题。JVM 提供了参数TLABSize来控制TLAB的大小,JVM会自己推断这个值多大更合适,设置TLAB占用Eden空间的百分比...原创 2019-12-24 22:53:42 · 277 阅读 · 0 评论 -
JVM G1源码分析和调优书 阅读笔记 一
G1 垃圾回收器 分区 Heap Region,下限是1MB,上限是32MB,默认整个堆空间分为2048个分区region1.通过G1HeapRegionSize可以指定大小,默认值为02.不指定region大小,由G1启发式推断HR大小 ---- 根据堆空间最大值和最小值,以及HR的个数进行推断如果G1 是启发式推断新生代的大小,扩张时如果有空闲的分区列表,就直接加入到新生代分区列表...原创 2019-12-22 21:36:01 · 1123 阅读 · 0 评论 -
Java 新垃圾回收器深入学习 G1
https://www.cnblogs.com/chenpt/p/9803298.html先看下G1 垃圾回收器之前介绍的几组垃圾收集器组合,都有几个共同点:年轻代、老年代是独立且连续的内存块;年轻代收集使用单eden、双survivor进行复制算法;老年代收集必须扫描整个老年代区域;都是以尽可能少而块地执行GC为设计原则。G1垃圾收集器也是以关注延迟为目标、服务器端应用的垃圾...原创 2019-12-08 11:23:37 · 270 阅读 · 0 评论 -
知识点复习46 Java 垃圾回收03
吞吐量优先选择什么垃圾回收器?响应时间优先呢?新生代 Parallel GC 回收器新生代 Parallel GC 回收器与新生代 ParNew 回收器非常类似,其也是使用复制算法,都是多线程、独占式的收集器,也会导致 Stop-The-World。但其余 ParNew 回收器的一个重大不同是:其非常注重系统的吞吐量。之所以说新生代 Parallel GC 回收器非常注重系统吞吐量,是...原创 2019-10-13 14:47:33 · 189 阅读 · 0 评论