JVM调优(六)
一、常见垃圾回收器组合参数设定
1、-XX: UseConcMarkSweepGC = ParNew + CMS + Serial Old
2、-XX: Use[arallelGC = Parallel Scavenge + Parallel Old(1.8默认)【PS + SerialOld】
3、UseParallelOldGC = Parallel Scavenge + Parallel Old
4、UseG1GC = G1
二、了解JVM常用命令行参数
1、标准:-开头,所有Hotspot
非标准:-X开头,特定版本HotSpot支持特定命令
不稳定:-XX开头,下个版本可能取消
可以通过:java -XX:+PrintFlagsFinal() -version | grep CMS命令查找JVM参数
2、常用命令
内存泄漏:某个对象占用内存空间无法被回收 内存溢出:内存中所有的对象所占用的总空间超过物理内存空间
①java -XX:+PrintCommandLineFlags HelloGC
-XX:InitialHeapSize -XX:MaxHeapSize -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
初始堆内存 最大堆内存 查看程序使用的默认的JVM参数 Pointers参数保持与Oops参数相同的状态,Oops开启时类型指针为4字节,关闭时为8字节
②java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
新生代 最小堆 最大堆大小
实际环境中最大堆与最小堆内存一般设置相同大小,避免弹性压缩。弹性压缩:当内存大小超过最小堆后,弹到最大堆中,当最小堆有空闲内存时,从最大堆弹出对象到最小堆
GC命令:PrintGCDetails打印GC详细信息 PrintGCTimeStamps打印GC时间 PrintGCCauses打印GC产生的原因
MaxNewSize:最大年轻代大小 NewSize:其实年轻代大小
③java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
④java -XX:+PrintFlagsInitial 默认参数值
⑤java -XX:+PrintFlagsFinal 最终参数值
⑥java -XX:+PrintFlagsFinal | grep xxx找到对应参数
⑦java -XX:+PrintFlagsFinal -version | grep GC
三、GC日志详解
四、调优前基础知识
1、吞吐量:用户代码时间➗(程序运行时间+垃圾回收时间)
2、响应时间:STW时间越短,响应时间越短
STW:JVM在垃圾回收中卡顿的时间,这段时间内,程序是无法运行的
所谓调优,首先确定追求啥?吞吐量还是响应时间?
如果为吞吐量优先,垃圾回收器选择PS+PO。如果为响应时间优先,垃圾回收器选择G1
五、什么是调优
1、预调优
①根据业务场景选择垃圾回收器
②买最大CPU的服务器。CPU是指从内存获取数据后进行数据计算,内存交换数据
③设定日志参数:方案一:-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFile=5
-XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
%t指系统时间 UseGCLogFileRotation循环使用 NumberOfGCLogFile几个日志文件
优点:日志文件大小只有100M 能不能只设置一个日志文件?不行,有些服务器一天产生的大小就上T
方案二:每天产生一个日志文件
④案例一:垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置?
找到下单最高峰的时间,比如下午6点有1000个订单。
如果非要计算一个订单产生需要多少内存?要求响应时间在多少ms的情况下去做压测
2、优化环境
①案例:有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G的堆,用户反馈网站比较慢,因此公司决定升级,新的服务器为64位,16G的堆,结果用户反馈卡顿十分严重,反而效率更低了
为什么原网站慢?很多用户浏览数据,数据从磁盘load到内存,内存空间不足,频繁GC,STW时间长,响应时间长
为什么升级后网站更慢?堆内存越大,FGC时间越长,STW时间越长,响应时间越长
如何解决?PS换成PN+CMS或G1
②系统CPU经常100%,如何调优?
a、一定有线程占用CPU资源,找出哪个进程cpu高(top)
b、该进程中的哪个线程cpu高(top -Hp 进程号)
c、导到该线程的堆栈(jstack 线程号)
d、查找哪个方法(栈帧)消耗时间(jstack)
③系统内存飙高,如何查找内存?
a、导出堆内存(jmap)
b、分析
④如何监控JVM
top:查看哪个进程占用CPU较多
top -Hp pid:查看进程下哪个线程占用资源较多
jstack pid:将进程中所有线程信息全部列出。使用jstack重点关注WAITING、BLOCKED
waiting on<0x0000000088ca3310>(a java.lang.Object):锁信息
假如有一个进程中有100个线程,很多线程都在waiting on<xx>,一定要找到是哪个线程持有这把锁
jps:查看所有java程序的进程
⑤定位OOM问题:面试时时候说使用arthas;测试时候使用java VisualVM工具,JDK自带,在bin目录下。添加JMX连接,抽样器中点击内存查看内存使用情况
⑥jmap -histo pid | head -20:查找多少个对象产生,查看前20个
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。