我们对这个jar包,要监控什么,为什么jvm需要调优,怎么监控指标,什么时候需要去进行调优呢.
这里先做一个第一版的总结:
我们知道,在java、中,是不用去进行内存管理的。
内存管理,由GC做了,我们需要做的就是去了解GC
这里先简单的过一遍这个jvm会做到事情
1.判断对象什么时候可以被回收、使用引用计数法,或者可达性分析
2.在jvm中使用了常见的垃圾回收器,选择对应的垃圾回收算法,来处理这些被回收的对象。
这里花费一些篇幅讲,垃圾回收算法,
1.标记清除算法
2.复制算法
3.标记整理算法
4.分代收集算法
垃圾回收器:
1.适用于个人电脑的串行垃圾收器:使用标记整理算法,单线程,垃圾回收所有的都stw
2.并行垃圾回收器(jdk8默认使用)
parallel new(作用于新生代。复制算法)
parallel old(作用于老年代,标记整理算法)
java中多线程工作,但是垃圾回收的时候,要stw
3.cms垃圾回收器
垃圾回收的时候,不会stw
4.G1垃圾回收器
对于这些垃圾回收器,应该如何选择使用。
- 一般来说吞吐量优先的垃圾回收器:-XX:+UseParallelGC -XX:+UseParallelOldGC,即常规的(PS/PO)
- 响应时间优先的垃圾回收器:CMS、G1
为什么需要调优呢,两个问题
1.gc出现问题了,heap(老年代)内存,fullgc次数频繁,gc停顿长,出现oom,或者outofmemoryerror问题。就是这个指标等监控的时候出现问题了。
2.其他指标出现了问题,想要提高吞吐量,或者低延迟的指标,硬件的内存,cpu指标过高,有本地缓存,或者占用大量的空间,就是不是jvm内部的指标出现问题了,而是对于项目的其他因素产生了不好的影响。
如何监控到jvm的状态,或者异常
1.使用arthas监控jar包正在运行的状态
2.cpu过高,内存过高,
cpu过高,找到对应的进程id,线程id,使用jstack打印出对应的堆栈信息
内存过高,找到对应的进程id,使用jmap的命令找到对应的,内存分配情况,哪个对象占用内存多,哪些存活对象占用内存多
如何进行调优
1.找到问题点,直接修改代码
导出oom、的dump文件,用工具分析
2.在jvm启动的时候,加上参数
这里先说一下,可以加的参数类型
1.java初始化内存的设置xms
2.java运行时内存设置xmx
3.指定分代回收算法,新生代,老年代的比例
4.指定垃圾回收器
5.打印gc日志
如何处理相关的问题的思路
1.ygc耗时过长的处理防范
2.线上频繁fullgc的处理方案是什么