亿级流量系列——JVM调优原理深度剖析、服务线上优化实践


亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
主题:
1、jvm调优原因--- 为什么要进行jvm调优!(海恩法则 , 墨菲定律)2、jvm调优原理--- 垃圾回收算法 , 如何进行调优3、jvm调优实战--- 设置jvm调优参数 , 根据这些参数压力测试4、jvm调优gc日志 , 根据日志情况 , 对服务进行再次调优复制代码1 为什么要进行JVM调优?思考1: 项目上线后 , 什么原因使得我们需要进行jvm调优
1)、垃圾太多(java线程 , 对象占满内存) , 内存占满了 , 程序跑不动了!!2)、垃圾回收线程太多 , 频繁的回收垃圾(垃圾回收线程本身也会占用资源: 占用内存 , cpu资源) , 导致程序性能下降3)、回收垃圾频繁导致STW
因此基于以上的原因 , 程序上线后 , 必须进行调优 , 否则程序性能就无法提升;也就是程序上线后 , 必须设置合理的垃圾回收策略;
思考2: jvm调优的本质是什么??
答案: 回收垃圾 , 及时回收没有用垃圾对象 , 及时释放掉内存空间
思考3: 基于服务器环境 , jvm堆内存到底应用设置多少内存?
1、32位的操作系统 --- 寻址能力 2^32 = 4GB ,最大的能支持4gb; jvm可以分配 2g+
2、64位的操作系统 --- 寻址能力 2^64 = 16384PB , 高性能计算机(IBM Z unix 128G 200+)
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
Jvm堆内存不能设置太大 , 否则会导致寻址垃圾的时间过长 , 也就是导致整个程序STW, 也不能设置太小 , 否则会导致回收垃圾过于频繁;
2 Jvm调优原则1)、gc时间足够小 (堆内存设置要足够小)
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
2)、gc次数足够少 (堆内存设置足够大)---- 垃圾装满了(很长时间才能装满空间) , 才开始回收垃圾
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
3)、发生full gc周期足够长
1)metaspace 永久代空间设置稍微合理一些 , 永久代一代扩容 , 立马发生full gc2) 老年代设置空间大一些 , 如果老年代装不满的话 , 永远不会发生full gc3) 尽量让垃圾再年轻代被回收掉4)尽量少一些大对象复制代码3 Jvm调优原理-GC3.1 什么是垃圾?
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
在内存中没有被引用的对象 , 这些对象就是垃圾;在堆内存中 , 一个对象引用没了 , 那么这个对象就必须要被回收;
3.2 怎么找垃圾?Jvm中有2种垃圾寻找算法(找垃圾的方法) 1、引用计数算法 2、根可达算法 1)引用计数算法
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
引用计数算法判断对象是垃圾的方法就是 , 当计数为0的时候 , 就判断此对象为垃圾; 存在问题:不能解决循环引用计数的问题;
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
以上这个对象相互引用 , 导致引用计数始终不为0 , 因此无法判断其是垃圾 , 但是这几个对象都没有被外部对象引用 , 因此他们就是垃圾;
2)、根可达算法
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
根可达算法是目前jvm使用主流的垃圾回收算法;oracle公司hotspot 都是使用这个算法;
3.3 如何清除垃圾?Jvm提供了3种方法(算法)----- 1、Mark-sweep --- 标记清除算法 2、copying – 拷贝 3、mark-compact 标记压缩算法
1)Mark-sweep --- 标记清除算法
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
1、从内存空间中寻找垃圾 , 对找到的垃圾进行标记 2、对标记的垃圾进行清除即可 优点: 简单 , 高效 缺点: 存在很多不连续的内存空间 , 内存空间碎片化;导致寻址的效率下降 , 性能下降
2)、copying – 拷贝
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
1、选择存活对象 2、把存活对象拷贝另一半空间中 , 这个是连续的内存空间 3、把存活对象全部拷贝完毕后 , 直接清除掉上面那一半空间即可完成垃圾回收;
优点: 简单 , 内存空间是连续的 , 不用担心内存空间碎片化 缺点: 内存空间的浪费
【亿级流量系列——JVM调优原理深度剖析、服务线上优化实践】3)mark-compact 标记压缩算法
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图