JVM实战

180 阅读3分钟

JVM常用的命令行参数

-Xmn 新生代的大小

-Xms -Xmx 堆heap的大小

-XX:+PrintCommandLineFlags //打印GC的参数

-Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC // 打印GC的信息

-XX:+PrintFlagsInitial 默认参数值

-XX:+PrintFlagsFinal 最终参数值

java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数

java -XX:+PrintFlagsFinal -version |grep GC

-XX:+HeapDumpOnOutOfMemoryError OOM时产生Dump文件,可以用jvisualvm解析

调优前概念

吞吐量:用户代码时间 /(用户代码执行时间 + 垃圾回收时间)选 ps + po

响应时间:STW越短,响应时间越好 1.8选 G1

Q(查询)PS、T(事务)PS

PS (per-second)每秒

并发:下单数量 最高淘宝 54W/s,有一千就不错了,用户就有几十万了

什么是调优?

  1. 根据需求进行JVM规划和预调优
  2. 优化运行JVM运行环境(慢,卡顿)
  3. 解决JVM运行过程中出现的各种问题(OOM)

预调优

  • 调优,从业务场景开始,没有业务场景的调优都是耍流氓
  • 无监控(压力测试,能看到结果),不调优
  • 步骤:
    1. 熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
      1. 响应时间、停顿时间 [CMS G1 ZGC] (需要给用户作响应)
      2. 吞吐量 = 用户时间 /( 用户时间 + GC时间) [PS]
    2. 选择回收器组合
    3. 计算内存需求(经验值 1.5G 16G)
    4. 选定CPU(越高越好)
    5. 设定年代大小、升级年龄
    6. 设定日志参数
      1. -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
      2. 或者每天产生一个日志文件
    7. 观察日志情况

案例:

1、垂直电商,最高每日百万订单,处理订单系统需要什么样的服务器配置?

先看每秒最多需要支持多少

例如:1小时360000集中时间段, 100个订单/秒,(找一小时内的高峰期,1000订单/秒)

具体服务配置需要压测

非要计算:看一个订单产生需要多少内存

大流量处理方法:分而治之

2、有一个50万PV的资料类网站(从磁盘提取文档到内存)原服务器32位,1.5G 的堆,用户反馈网站比较缓慢,因此公司决定升级,新的服务器为64位,16G 的堆内存,结果用户反馈卡顿十分严重,反而比以前效率更低了

为什么原网站慢? 很多用户浏览数据,很多数据load到内存,内存不足,频繁GC,STW长,响应时间变慢

为什么会更卡顿? 内存越大,FGC时间越长

咋办? PS -> PN + CMS 或者 G1

3、系统CPU经常100%,如何调优?(面试高频)

  • CPU100%那么一定有线程在占用系统资源(top)
  • 找出CPU高的进程(top -Hp)
  • 如果是Java进程,导出该线程堆栈(jstack)
  • 查找哪个方法(栈帧)的消耗时间(jstack)

4、系统内存飙高,如何查找问题?(面试高频)

  • 如果是Java进程,导出该线程堆(jmap)
  • 分析(jhat、jvisualvm)

5、如何监控JVM

arthas

线上实战调优

1、定位问题

jmap -histo 进程ID|head -20

jmap -dump:format=b,file=xxx pid :

线上系统,内存特别大,jmap执行期间会对进程产生很大影响,甚至卡顿(电商不适合)

1:设定了参数HeapDump,OOM的时候会自动产生堆转储文件

2:很多服务器备份(高可用),停掉这台服务器对其他服务器不影响

3:在线定位(一般小点儿公司用不到)(arthas)

2、问题产生的原因

  • 硬件升级系统反而卡顿的问题
  • 线程池不当运用产生OOM问题
  • 不断的往List里加对象(LOW)