jdk1.8默认垃圾收集器是ParallelGC
评价一个垃圾收集器的好坏
停顿时间+吞吐量+GC次数
CMS 使用cms作为垃圾收集器(cms适用于老年代),新生代默认会选择(ParNewGC)
不重点关注
改成G1
文件太多参数了,看得费劲,下面官网介绍日志中的每一个参数
GCEasy gcviewer
吞吐量和停顿时间
Mixed:表示young区和部分old区的GC
超过45%,触发并发周期,触发region区的GC
调优就是不断修改参数,寻找一个最佳点
减少GC次数
我们可以调整堆大小,看参数是否变化
设置-Xms500M -Xmx500M 初始化和最大的一样
然后堆大小增加后,吞吐量上升,GC次数下降。说明增加堆是有变化的
那我们不管什么时候都可以直接增大堆?no
观察停顿时间增加了,这是不好的方向。因为堆空间变大,存放更多垃圾,周期增长,越积越多,
G1垃圾收集器区别于其他收集器的就是可以设置停顿时间
我们不妨设置一下停顿时间,减小
XX:MaxGCPauseMillis=100(设置最大停顿时间)
看到gc次数又有所增加了,我们修改了停顿时间,导致gc次数有上升了,g1标记回收没有完成,下一次继续,导致次数增加,所以我们设置的停顿时间需要继续调整,不要将时间太小,不断尝试,寻找一个平衡点
启动并发GC是堆内存使用占比
比方45%时候触发
我们改成50%
-XX:InitiatingHeapOccupancyPercent=50
不断调整,找到最佳值,下面是官网文档地址,可以参考进行调优
不要调整young区大小,G1会自动调整young区大小
停顿时间不要太严格
设置堆内存使用比例
jvm调优就是不断尝试,找寻最佳参数
G1和CMS区别,为什么会诞生G1
G1有region,对堆内存进行逻辑分区,划分为一个个的region,每一个region大小相等,保留新生代,老年代,大对象,每个区域不一定非得放新生代,采用标记整理,减少空间碎片,优先收集垃圾比较多的区域,保证空间连续
Cset:存活对象移动到CSet <1%
cpu是多核,大内存可以使用G1
以前新生代和老年代是连续的,必须扫描老年代
jdk1.9默认G1垃圾收集器
高并发场景下如何进行调优(机器好,项目小无需调优)
每秒3000比交易,如何和jvm联系在一起
需要集群,机器好无所谓,如果机器不好呢
每个机器有1000单每秒
jvm设置内存多大合适
如何减少fullGC次数?Young适当增加,因为young区每隔一段时间就回收
什么是jvm的性能优化,如何优化
有问题就需要优化,
GC次数频繁,为什么你知道频繁,可能cpu使用率高了,首先打印GC日志,结合工具看一下是哪个gc频繁,适当增加堆内存空间,垃圾收集器可能不合适,如果垃圾收集器选择合适,调整收集器,比方G1,调整停顿时间
cpu持续飙升怎么办?为什么你看到cpu升高?top一下,看一下哪个进程,通过jstack查看线程,jmap查看堆内存,如何解决,集群,MQ,业务代码会不会有线程死锁情况,
如果发生oom?dump文件出来,分析文件,用工具MAT,减少并发
内存泄漏和内存溢出(OOM)区别?
内存泄漏对象没有及时回收,持续占用内存空间,内存空间浪费
由于内存泄漏慢慢会导致内存溢出
方法区的回收主要回收什么内容?
不可达对象一定会被回收吗?
不是,不可达对象通过finalize()方法变成不是垃圾对象