<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Waiting_Mr_Liu的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Waiting_Mr_Liu]]></copyright><item><title><![CDATA[JVM调优之OOM案例汇总分析]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111305292</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111305292</guid><author>Waiting_Mr_Liu</author><pubDate>Wed, 16 Dec 2020 23:10:44 +0800</pubDate><description><![CDATA[9.6.	OOM案例汇总
OOM产生的原因多种多样，例如，有些程序未必产生OOM，但是会不断FGC，或是CPU飙高但内存回收特别少。出现OOM的场景进行记录，如下所示：
【案例1】硬件升级系统反而卡顿的问题，如调优实战小节中的调优实战1。
【案例2】线程池不当运用产生OOM问题，如调优实战小节中的调优实战2。
【案例3】jira问题，详细信息见附件。该问题导致的现象是系统出现FGC很频繁，实际系统不断重启。解决方案是更换垃圾回收器G1，换用更大的内存。
【案例4】tomcat中的http问题，详细信息见附件]]></description><category></category></item><item><title><![CDATA[GC调优的监测工具]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111305260</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111305260</guid><author>Waiting_Mr_Liu</author><pubDate>Wed, 16 Dec 2020 23:09:11 +0800</pubDate><description><![CDATA[9.5.	监测工具
9.5.1.	jconsole远程连接
jconsole在使用之前，需要在程序启动时加入参数：
java -Djava.rmi.server.hostname=192.168.17.11 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremot]]></description><category></category></item><item><title><![CDATA[GC调优的场景、目标、步骤]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111188280</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111188280</guid><author>Waiting_Mr_Liu</author><pubDate>Mon, 14 Dec 2020 23:24:57 +0800</pubDate><description><![CDATA[9.4.	GC调优
9.4.1.	调优的目标
**1）吞吐量：**吞吐量=用户代码执行时间/（用户代码执行时间+垃圾回收时间）
**2）响应时间：**垃圾回收算法中的STW时间越短，响应时间越好
在进行调优的时候，首先要确定调优的首要目标是什么？响应时间优先，还是吞吐量优先，还是在一定响应时间范围内吞吐量最大等等。
如果是吞吐量优先，可以考虑Parrallel Scavenge和Parrallel Old垃圾回收器组合；这种一般出现在科学计算、数据挖掘、thrput等场景。如果是响应时间优先，那么要考虑JD]]></description><category></category></item><item><title><![CDATA[垃圾回收器可调参数汇总]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111147680</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111147680</guid><author>Waiting_Mr_Liu</author><pubDate>Sun, 13 Dec 2020 23:23:37 +0800</pubDate><description><![CDATA[9.3.	垃圾回收器可调参数汇总
9.3.1.	通用可调参数
	-Xmn -Xms -Xmx -Xss    年轻代 最小堆 最大堆 栈空间
	-XX:+UseTLAB          使用TLAB，默认打开
	-XX:+PrintTLAB         打印TLAB的使用情况
	-XX:TLABSize           设置TLAB大小
	-XX:+DisableExplictGC   System.gc()不管用 ，FGC
	-XX:+PrintGC           打印GC的信]]></description><category></category></item><item><title><![CDATA[GC日志]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111086927</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111086927</guid><author>Waiting_Mr_Liu</author><pubDate>Sat, 12 Dec 2020 23:26:07 +0800</pubDate><description><![CDATA[9.2.	GC日志
1）特别说明
每种垃圾回收器的日志格式是不同的
2）实际生产中日志参数设置
在实际生产中要保存的日志格式如下所示，至少需要包含以下内容：
-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log   设置日志的保存位置
-XX:+UseGCLogFileRotation     设置日志循环保存
-XX:NumberOfGCLogFiles=5     设置使用5个日志文件
-XX:GCLogFileSize=20M          设置每个日志文件的大小为20M]]></description><category></category></item><item><title><![CDATA[JVM常用命令行参数]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111055148</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111055148</guid><author>Waiting_Mr_Liu</author><pubDate>Fri, 11 Dec 2020 23:30:12 +0800</pubDate><description><![CDATA[9.1.	JVM常用命令行参数
1）HotSpot参数分类
标准	- 开头	所有的HotSpot都支持
非标准	-X 开头	特定版本HotSpot支持特定命令
不稳定	-XX 开头	下个版本可能取消
2）查询参数的方法
采用命令：-XX:	PrintFlagsFinal -version | grep 待查询的东西
例如寻找所有与CMS垃圾回收器相关的参数，使用指令-XX:PrintFlagsFinal -version | grep CMS
3）关于GC的常用命令行参数
a) -XX:+PrintComm]]></description><category></category></item><item><title><![CDATA[ZGC垃圾回收器]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111026225</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/111026225</guid><author>Waiting_Mr_Liu</author><pubDate>Thu, 10 Dec 2020 23:31:33 +0800</pubDate><description><![CDATA[8.5.5.	ZGC垃圾回收器
1）ZGC的介绍
ZGC垃圾回收器全称为Z Garbage Collector，是一个可伸缩的、低延迟、并发的垃圾收集器，主要为了满足如下目标进行设计：
1.停顿时间不会超过10ms
2.停顿时间不会随着堆的增大而增大（不管多大的堆都能保持在10ms以下）
3.可支持几百M，甚至几T的堆大小（最大支持4T）
2）ZGC的停顿时间
停顿时间在10ms以下，10ms其实是一个很保守的数据，在SPECjbb 2015基准测试，128G的大堆下最大停顿时间才1.68ms，远低于10m]]></description><category></category></item><item><title><![CDATA[G1垃圾回收器]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110919064</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110919064</guid><author>Waiting_Mr_Liu</author><pubDate>Wed, 09 Dec 2020 11:25:19 +0800</pubDate><description><![CDATA[8.5.4.	G1垃圾回收器
8.5.4.1.	基本概念
1）Card Table设计
由于做YGC时，需要扫描整个Old区，效率非常低，所以JVM设计了CardTable， 如果一个Old区CardTable中有对象指向Young区，就将它设为Dirty，下次扫描时，只需要扫描Dirty Card即可。在结构上，Card Table用BitMap来实现。
2）Cset
Cset的全称是Collection Set，这是一组可被回收分区的集合。在Cset中存活的数据会在GC过程中被移动到另一个可用分区，Cs]]></description><category></category></item><item><title><![CDATA[ParNew和CMS垃圾回收器组合]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110631303</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110631303</guid><author>Waiting_Mr_Liu</author><pubDate>Fri, 04 Dec 2020 11:13:11 +0800</pubDate><description><![CDATA[8.5.3.	ParNew和CMS垃圾回收器组合
8.5.3.1.	ParNew和CMS垃圾回收器组合
1）工作地点
ParNew垃圾回收器工作在年轻代，而CMS工作在老年代。
2）工作原理
当使用ParNew垃圾回收器时：首先在用户线程处于安全的时候执行STW（stop-the-world），这个时刻称为安全点，执行STW时用户线程会暂停执行，同时会有多个线程来并行清理垃圾，垃圾清理的算法是Copying拷贝算法。ParNew与Parallel Scavenge十分相似，ParNew是Parallel S]]></description><category></category></item><item><title><![CDATA[Parallel Scavenge和Parallel Old垃圾回收器组合]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110457037</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110457037</guid><author>Waiting_Mr_Liu</author><pubDate>Tue, 01 Dec 2020 23:23:42 +0800</pubDate><description><![CDATA[8.5.2.	Parallel Scavenge和Parallel Old垃圾回收器组合
1）工作地点
Parallel Scavenge垃圾回收器工作在年轻代，而Parallel Old工作在老年代。
2）工作原理
当使用Parallel Scavenge垃圾回收器时：首先在用户线程处于安全的时候执行STW（stop-the-world），这个时刻称为安全点，执行STW时用户线程会暂停执行，同时会有多个线程来并行清理垃圾，垃圾清理的算法是Copying拷贝算法。
当使用Parallel Old垃圾回收器时]]></description><category></category></item><item><title><![CDATA[Serial和Serial Old垃圾回收器组合]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110456992</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110456992</guid><author>Waiting_Mr_Liu</author><pubDate>Tue, 01 Dec 2020 23:22:32 +0800</pubDate><description><![CDATA[8.5.1.	Serial和Serial Old垃圾回收器组合
1）工作地点
Serial垃圾回收器工作在年轻代，而Serial Old工作在老年代。
2）工作原理
当使用Serial垃圾回收器时：首先在用户线程处于安全的时候执行STW（stop-the-world），这个时刻称为安全点，执行STW时用户线程会暂停执行，同时会有一个单独的线程来清理垃圾，垃圾清理的算法是Copying拷贝算法。
当使用Serial Old垃圾回收器时：首先在用户线程处于安全的时候执行STW（stop-the-world），这]]></description><category></category></item><item><title><![CDATA[垃圾回收器及其组合]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110456919</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110456919</guid><author>Waiting_Mr_Liu</author><pubDate>Tue, 01 Dec 2020 23:20:11 +0800</pubDate><description><![CDATA[8.5.	垃圾回收器及其组合
1）GC大致的分类
在年轻代空间耗尽时进行回收的机制，叫做MinorGC/YGC，频率比较高，因为大部分对象的存活寿命较短，在新生代里被回收。性能耗费较小。
在老年代耗尽时进行回收或是在新生代和老年代同时进行回收的机制，叫做MajorGC/FullGC。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例，一般比较少会触发fgc，有时10天或一周左右会有一次。

2）GC调优中的栈上分配和线程本地分配
在GC调优中，栈上分配和线程本地分配无需调整。
3）常用]]></description><category></category></item><item><title><![CDATA[堆内存逻辑分代结构]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110130656</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/110130656</guid><author>Waiting_Mr_Liu</author><pubDate>Wed, 25 Nov 2020 14:55:23 +0800</pubDate><description><![CDATA[7.4.	堆内存逻辑分代结构
1）部分垃圾回收器使用的模型
除Epsilon、ZGC、Shenandoah之外的GC均采用逻辑分代模型，包含Serial、Serial Old、Parallel Scavenge、Parallel Old、ParNew 、CMS、G1等垃圾回收器，其中，G1只是逻辑分代但是物理不分代，其他的垃圾回收器既是逻辑分代也是物理分代。
2）逻辑分代模型介绍
逻辑分代模型如下图所示，其中可分为两代-young新生代和old老年代，除了G1和Shenandoah等垃圾回收期外的其他垃圾回]]></description><category></category></item><item><title><![CDATA[GC-垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910779</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910779</guid><author>Waiting_Mr_Liu</author><pubDate>Sat, 21 Nov 2020 22:50:54 +0800</pubDate><description><![CDATA[7.3.	垃圾回收算法
7.3.1.	Mark Sweep标记清除
1）Mark Sweep算法的原理
Mark Sweep算法称为标记清除算法，原理上：将对象划分为三个类别-存活对象、未使用对象、可回收对象，标记清除算法就是将可回收对象清理掉。

2）实现过程
第一步，对所有区域进行第一遍扫描，利用root Searching垃圾定位算法找到所有不可回收的区域和可回收的区域。第二步，对所有区域进行第二遍扫描，将所有可回收的部分进行清理，完成清理工作。此外，所有空闲的区域，使用空闲列表进行管理。

3）优势]]></description><category></category></item><item><title><![CDATA[GC-垃圾定位算法]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910730</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910730</guid><author>Waiting_Mr_Liu</author><pubDate>Sat, 21 Nov 2020 22:47:46 +0800</pubDate><description><![CDATA[7.2.	垃圾定位算法
7.2.1.	RC 引用计数
1）RC的定义
RC全称为reference count，引用计数。原理上就是对象中有个参数（引用计数）记录有多少个引用使用了它，每有一个引用放弃使用该对象，那么该参数（引用计数）-1，当为0的时候该对象就变成了垃圾。该过程如下所示。




2）存在的问题
RC算法无法解释环形垃圾。如下图所示，如果这个环形部分整体为垃圾时，此时可以观察到其中的每个对象的引用计数值均为1，所以RC算法不再适用。

7.2.2.	Root Searching根可达
1）R]]></description><category></category></item><item><title><![CDATA[GC-Java中的垃圾]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910690</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109910690</guid><author>Waiting_Mr_Liu</author><pubDate>Sat, 21 Nov 2020 22:45:56 +0800</pubDate><description><![CDATA[7.1.	垃圾的基本介绍
1）垃圾的定义
在堆中没有任何引用指向的对象，或者仅包含循环引用的多个对象，就是垃圾。
2）Java、C++的垃圾回收机制对比
Java	C++
回收机制	自动回收垃圾	手动回收，可能会多次回收（非法访问）和忘记回收（内存泄漏）
优势	开发效率高	执行效率高
劣势	执行效率低	开发效率低
3）垃圾回收区域分类
根据分代模型的概念，垃圾回收可以分为两大类，而部分收集Partial GC又可以分为三类：
部分收集Partial GC	新生代收集Minor GC	只收集新生代中的垃圾
老]]></description><category></category></item><item><title><![CDATA[JVM常用指令]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109843218</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109843218</guid><author>Waiting_Mr_Liu</author><pubDate>Fri, 20 Nov 2020 11:21:30 +0800</pubDate><description><![CDATA[3	JVM常用指令
3.1.	指令集介绍
1）指令集的分类
指令集大体上可分为两类：基于栈的指令集、基于寄存器的指令集。基于栈的指令集是利用出栈和进栈来实现的，基于寄存器的指令集是通过寄存器的特性来实现的，基于寄存器的指令集复杂但是高效。
2）基于栈的指令集
大多数指令并不包含操作数，只有一个操作码，指令参数都存放于操作数栈中，操作码的长度为一个字节（即0-255），所以指令集的操作码总数不会超过256条。
3）样例介绍
【样例程序1】
程序代码、程序对应生成的字节码文件、局部变量表内容如下所示



因为]]></description><category></category></item><item><title><![CDATA[指令重排序]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109757434</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109757434</guid><author>Waiting_Mr_Liu</author><pubDate>Tue, 17 Nov 2020 23:05:57 +0800</pubDate><description><![CDATA[2.3.	指令重排序
2.3.1.	指令重排序的介绍
1）指令重排序的类型
在执行程序时为了提高性能，编译器和处理器常常会对指令做重排序。重排序分三种类型：
编译器优化的重排序	编译器在不改变单线程程序语义的前提下（代码中不包含synchronized关键字），可以重新安排语句的执行顺序。
指令级并行的重排序	现代处理器采用了指令级并行技术（Instruction-Level Parallelism， ILP）来将多条指令重叠执行。如果不存在数据依赖性，处理器可以改变语句对应机器指令的执行顺序。
内存系统的]]></description><category></category></item><item><title><![CDATA[数据一致性]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109701580</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109701580</guid><author>Waiting_Mr_Liu</author><pubDate>Sun, 15 Nov 2020 11:16:12 +0800</pubDate><description><![CDATA[2.2.1.	存储结构
1）存储器的存储结构
存储的层次结构可以分为两大类：一是CPU内部的，有寄存器、一级高速缓存、二级高速缓存；二是位于CPU共享的部分，包含：三级高速缓存、主存、硬盘、远程存储。数据的读取和存储都要经过高速缓存(Cache)，CPU(CPU Core)与高速缓存间有一条特殊的快速通道。主存(Main Memory)与高速缓存都连接在系统总线(Bus)上，系统总线同时还用于其他组件的通信。
在高速缓存出现后不久，系统变得更加复杂，高速缓存与主存间的速度差异被拉大，直到加入了另一级缓存，新]]></description><category></category></item><item><title><![CDATA[运行时内存-CPU多级缓存]]></title><link>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109633371</link><guid>https://blog.youkuaiyun.com/Waiting_Mr_Liu/article/details/109633371</guid><author>Waiting_Mr_Liu</author><pubDate>Wed, 11 Nov 2020 22:56:53 +0800</pubDate><description><![CDATA[5.3.	CPU多级缓存
5.3.1.	CPU缓存基本介绍
1）CPU缓存出现的原因
CPU的频率太快，快到主存跟不上，这样在处理器时钟周期内，CPU经常需要等待主存，浪费资源。所以缓存的出现，是为了缓解CPU和内存间速度的不匹配问题。（结论：CPU&gt;缓存&gt;主存）
2）CPU缓存的意义
1)时间局部性：如果某个数据被访问，那么在不久的将来它很有可能会被再次访问。
2)空间局部性：如果某个数据被访问，那么与它相邻的数据很快也能被访问。
3）多核系统中的缓存设置意义
在典型的多核系统中，每一个核心都]]></description><category></category></item></channel></rss>