- 博客(12)
- 收藏
- 关注
原创 浅谈JVM的垃圾收集(二)——CMS垃圾收集器
背景作为浅谈JVM的垃圾收集(一)的后续文章,建议先看前文再来读这篇文章。前言上一篇文章介绍了三大垃圾收集算法,而垃圾收集器就是垃圾收集算法的具体实现。本文主要介绍垃圾收集器,重点介绍CMS、G1、ZGC和Shenandoah收集器实现的细节。年轻代收集器Serial、ParNew、Parallel Scavenge老年代收集器Serial Old、Parallel Old、CMS收集器特殊收集器G1收集器,跨代收集收集器,连线代表可结合使用CMS收集器CMS(C
2021-04-08 11:23:56 607
原创 浅谈JVM的垃圾收集(一)
前言本文主要介绍Java中的有关的垃圾收集算法,以及实现算法的垃圾收集器背景我们经常可以听到垃圾收集这个词,那Java中”垃圾“是指什么呢?为什么要收集“垃圾”呢?怎么知道哪些是“垃圾”呢?什么时候收集“垃圾”呢?怎么收集“垃圾”呢?带着这些问题来看这篇文章垃圾的定义百度百科的关于垃圾的定义垃圾是失去使用价值、 无法利用的废弃物品,是物质循环的重要环节。在Java中,万物皆对象。类似的,”垃圾“在Java中的定义即是失去使用价值、无法利用的对象,是垃圾收集的重要环节。为什
2021-04-08 11:20:23 320
原创 浅谈JVM的垃圾收集——OopMap与安全点
背景前面的文章介绍了可作为GC ROOT的节点包括:虚拟机栈中引用的对象方法区中常量和静态熟悉引用的对象本地方法栈中引用的对象等等具体可看这篇文章——浅谈JVM的垃圾收集(一)OopMap(Ordinary Object Pointer,普通对象指针)迄今为止,所有收集器在根节点枚举这一步骤都是必须暂停用户线程的,然后垃圾收集线程会对栈中的内存进行查找,看哪些位置存放了引用类型。但是如果要遍历整个栈,这无疑是很费时的。能不能把栈上代表的引用的位置全部记录下来呢?这样就不用全栈扫描了Hot
2021-04-08 11:17:27 1144 1
原创 浅谈JVM垃圾收集——记忆集与卡表
背景上一篇文章提到了,当JVM进行垃圾收集时,它是怎么判断对象是否跨代引用的呢?记忆集与卡表为解决对象跨代引用所带来的问题,垃圾收集器在新生代中建 立了名为记忆集(Remembered Set)的数据结构,用以避免把整个老年代加进GC Roots扫描范围。事实上并不只是新生代、老年代之间才有跨代引用的问题,所有涉及部分区域收集(Partial GC)行为的 垃圾收集器,典型的如G1、ZGC和Shenandoah收集器,都会面临相同的问题,记忆集是一种用于记录从非收集区域指向收集区域的指针集合的
2021-04-08 11:16:54 2883 7
原创 并发中的伪共享问题
背景伪共享问题的表现是:并发的修改在一个缓存行中的多个独立变量,看起来是并发执行的,但实际在CPU处理的时候,是串行执行的,并发的性能大打折扣。这个涉及到MESI(缓存一致性协议),参考链接:Cache一致性协议之MESI伪共享的原因就是 CPU 在 Invalid 的时候,是会直接废除一行的!如果 两个变量 (a,b) 同时在一个 Cache Line 中,处理器A修改了变量a ,那么处理器B中,这个 CacheLine 失效了,这个时候如果处理器B修改了变量b的话,就必须先提交处理器A的缓存
2021-04-08 11:16:01 513 2
原创 浅谈JVM垃圾收集——并发的可达性分析
前言当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象 是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析, 这意味着必须全程冻结用户线程的运行。在前面的文章分析中,根节点枚举在OopMap的帮助下,它带来的停顿已经是非常短暂且相对固定(不随堆容量而增长)的了。详情看:OopMap和安全点可从GC Roots再继续往下遍历对象图,这一步骤的停顿时间就必定会与Java堆容量直接成正比例关系了:堆越大,存储的对象越多,对象图结构越复杂,要标记更多对
2021-04-08 11:14:10 234 2
原创 浅谈本地线程分配缓冲——TLAB
前言本篇主要作为上一篇博客()进一步介绍TLAB。本地线程分配缓冲——TLABTLAB是虚拟机在堆内存的划分出来的一块专用空间,是线程专属的。在TLAB启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,就在自己的空间上分配,这样就不存在竞争的情况,可以大大提升分配效率。ps:这里说线程独享的堆内存,只是在“内存分配”这个动作上是线程独享的,至于在读取、垃圾回收等动作上都是线程共享的。即是指其他线程可以在这个区域
2021-04-08 11:12:04 1753
原创 Java中的引用
背景在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回 收掉被引用的对象。软引用
2021-04-08 11:11:06 97
原创 浅谈Java堆中对象的创建、布局和访问过程
前言本文主要针对Hotspot虚拟机,谈谈Java堆中对象的创建、布局和访问过程。背景Java是一门面向对象的编程语言,那么在JVM中对象是怎么创建的呢?对象的布局是怎样的呢?对象是怎么访问到的呢?带着这些问题 来看看这行代码Object o = new Object()//实例化对象并赋值给对象的引用;简单的说就是创建对象的操作,那么这些操作在Java虚拟机中是怎么表现的呢?对象的创建当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一
2021-04-08 11:10:14 290 2
原创 浅谈redis主从复制的replication buffer 和 replication backlog
浅谈redis配置文件的replication buffer 和 replication backlog配置参数
2020-10-26 19:16:03 5257
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人