![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java 内存回收
文章平均质量分 52
lixia0417mul2
避免成为那些从来没有接触过真正技术的所谓技术生涯
展开
-
swap引起的zgc safepoint超长问题排查
zgc safepoint超长问题排查原创 2023-12-29 10:28:49 · 459 阅读 · 0 评论 -
cms升级到zgc的性能数据统计
zgc vs cms zgc的一些性能统计 zgc对比cms原创 2023-07-11 22:20:20 · 308 阅读 · 0 评论 -
G1重要的参数
G1 垃圾收集器 G1 重要参数 G1 内存回收原创 2023-03-27 01:18:43 · 738 阅读 · 0 评论 -
zgc 内存和锁的知识点总结一
1.zgc的堆大小= Reserved内存+Free内存+User内存的大小,Reserved保留内存的是为了在并发转移阶段的过程中,并发gc线程发现内存不足的时候才使用的,一般的内存请求时不会使用到保留内存的,保留内存的大小=并行工作线程的数量(注意是并行gc工作线程的数量不是并发gc工作线程的数量) * 小页面的内存大小(一般是2M) + 一个中页面的内存大小(一般是32M),比如如果并行gc工作线程数量是10个,那么保留内存的大小就是10 * 2M + 32M = 42M2.zgc日志中的Gc Loc原创 2022-06-17 01:36:15 · 250 阅读 · 0 评论 -
zgc 并发标识和并发转移阶段的多视图地址映射
M0,M1,Remapped三种多视图地址映射是zgc能够实现并发标识和并发转移的关键前提,这三种地址其实都对应到同一个物理地址,对应的是同一个底层的对象,大体上zgc过程中的地址映射变换关系如下:第一轮的zgc:1.初始标识阶段初始标识阶段对象的地址视图都是Remapped2.并发标识阶段存活对象的地址从Remapped地址变成M0地址,非存活对象的地址依然保持为Remapped映射阶段,这个阶段中新分配对象的地址视图是M03.并发转移阶段存活对象(地址视图是M0)被转移到新的地址空间并重新原创 2022-06-11 21:19:00 · 300 阅读 · 0 评论 -
zgc的垃圾收集的主要阶段
zgc目前是整个堆收集的,没有分代,因此也省却了Rset等跨代记录引用的内存消耗,zgc的整个gc过程主要分为一下阶段:1.初始标识 (stw): 标识堆中的根对象,根对象主要包括线程栈,全局变量等2.并发标识:从第一阶段的根出发,并发标识从根对象可达的其他对象,与应用程序并发运行,标识的算法使用的是三色法标记对象,三色法标识对象的原理参见之前的文章3.重新标识(stw): 该阶段主要是重新标识由于并行阶段的线程并发运行带来的标识混乱的过程4.非强根引用处理: 该阶段处理Finalizer引用,虚引用,弱原创 2022-06-11 11:53:28 · 233 阅读 · 0 评论 -
zgc的Allocate stall原理
zgc allcate stall原创 2022-06-07 02:16:11 · 861 阅读 · 0 评论 -
zgc gc消息类型及触发时机
gc消息类型触发zgc的消息有两种类型,一种是同步消息,一种是异步消息,对于同步消息来说,触发同步消息的线程会等待gc完成后才能继续运行,比如System.gc的消息就是一个同步消息,应用线程需要等待gc完成后才能继续运行,当上一次同步消息触发的gc还在进行中然后又收到另一个同步消息请求时,会按照顺序触发gc,异步消息是由类似固定触发时间间隔触发的消息类型,当由上一次异步消息引起的gc还在进行中时,如果再收到另一个异步消息的请求,那会会忽略掉新来的异步消息,也即异步消息会去重同步消息触发时机Syste原创 2022-05-29 19:30:50 · 399 阅读 · 0 评论 -
zgc 与g1对比 及 color points含义
zgc对比g1的主要优势1.我们知道g1的ygc或者mixed gc的evacuation阶段中最耗时stw阶段就是对象复制转移,对象复制转移涉及内存的分配和对象成员变量的复制,非常耗时,zgc可以把这个最长stw阶段的耗时转化成并发执行,也就是和应用线程一起执行,在这个过程中主要是使用了读屏障和color pointer指针来达到并发转移的目的,后面会详细介绍读屏障和color pointer.2.zgc在进行对象转移的过程中,只需要修改对象指针的几个标志位,相当于g1需要在对象转移时读取对象头来说,原创 2022-05-28 12:28:04 · 1308 阅读 · 0 评论 -
cms 和 g1的主要区别
cms和g1的主要区别1.cms是内存分布式分代连续的,也就是新生代一块连续的区间,年老代一块连续的区间,而g1是把堆分成了2048个region,每个区域region可以作为新生代也可以作为年老代,并且新生代的大小(也即region的个数)是根据期望的暂停时间动态调整的.2.cms中大对象是直接分配到年老代的,而且ygc是没法回收年老代中的大对象的,必须要通过cms gc才能回收,而g1中大对象是直接分配到Humongous大对象区域的(不过该区域一般认为是年老代),这里g1比较好的一点是ygc的时候原创 2022-05-25 02:14:16 · 5681 阅读 · 0 评论 -
g1 的日志解析
g1 的内存布局是把整个堆分成大小比如=4M的区域,整个堆大概包括2048个Region,然后逻辑上再把这些一个个Region划分成Edge,Survivor,Old, Humongous代,注意这里的survivor区间没有From 和 To的区分,统一都叫做Survivor区域,看gc日志时需要注意ygc日志:/** Stw: G1 Evacuation Pause 表示跨Region转移对象, young表示是ygc,暂停时间是 0.1608499 secs*/2018-09-27T09:47原创 2022-05-24 19:01:34 · 990 阅读 · 0 评论 -
G1 垃圾回收解决的问题及原理
背景1.很久以来我们都是使用的ParNew + cms的垃圾组合回收方式作为jvm的标准垃圾收集器,然而随着我们使用的jvm堆内存的增加,我们发现新生代的gc时间超过了300ms,cms停顿时间也达到了300ms,由于cms的次数一般只是一天一次,所以年老代的gc我们勉强能够接受,然而由于新生代的gc几乎是每分钟一次,所以这个超时时间使我们不能够接受的,所以G1垃圾回收期就进入了我们的视野中2.我们应用中有很多的大内存对象,寿命都是5分钟到1个小时左右,这些对象一般都会进入到年老代中,由于年老代的对象只原创 2022-05-16 02:27:27 · 1234 阅读 · 0 评论