JVM调优实战

目录

1、什么是调优

2、吞吐量与响应时间

3、如何进行预调优

4、系统cpu经常100%,如何调优

5、系统内存飙高,如何查找问题

6、面试题


1、什么是调优

调优简单说就是把整个系统进行优化:

  • 根据需求进行JVM规划和预调优,比如为程序设置合适的内存、选择合适的垃圾回收器等
  • 当程序出现慢或者卡顿现象时,优化JVM运行环境
  • 解决JVM运行中出现的各种问题,比如OOM

2、吞吐量与响应时间

吞吐量:用户程序执行时间/(用户程序执行时间+垃圾回收时间)

  • 单位时间内,STW 的时间最短 (发生2次STW,0.2+0.2=0.4),垃圾回收时间占比最低,这样就称吞吐量高.
  • 业务场景:比如科学计算就要求吞吐量优先。
  • 垃圾回收器:PS+PO


响应时间:STW越短,程序响应越快

  • 单位时间内,可能发生5次STW,但是单次的STW时间最短(0.1+0.1+0.1+0.1+0.1=0.5)
  • 业务场景:电商网站,CSDN,对外提供的API等这类服务响应时间要优先。
  • 垃圾回收器:CMS,G1

3、如何进行预调优

1、熟悉业务场景,选择合适的垃圾回收器

  • 如果是响应时间优先,选择CMS、G1、ZGC;
  • 如果是吞吐量优先,就选择ParallelGC(PS+PO)

2、计算内存需求,给JVM设置合适的内存大小

  • 新生代能容纳所有【并发量 * (请求-响应)】的数据
  • 幸存区大到能保留【当前活跃对象+需要晋升对象】
  • 年轻代应该占整个堆内存的25%到50%
  • 晋升阈值配置得当,让长时间存活对象尽快晋升

3、选定CPU,越高越好

4、设定日志参数
-xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFile=5
-XX:GCLogFileSize=20M
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
在生产环境中日志文件,日志名字按照系统时间产生,循环产生,日志个数5个,每个大小20M,这样整体大小100M,便于控制,方便查找问题。

5、进行压测监控JMeter

4、系统cpu经常100%,如何调优

1、cpu100%那么一定是有线程在占用系统资源,先找到是哪个进程cpu占用高(top)
2、找到该进程中的哪个线程cpu高(top -H -p <PID>)
3、导出该线程的堆栈,需要将线程id从十进制转为十六进制,因为java线程栈文件中的线程id是十六进制(jstack PID 或  jstack PID > pid.tdump 导出文件)
4、查找哪个方法(栈帧)消耗时间(jstack)
5、工作线程占比高还是垃圾回收线程占比高

参考:https://blog.csdn.net/wangjun5159/article/details/90414097

5、系统内存飙高,如何查找问题

1、通过jmap命令导出堆文件( jmap -dump:live,format=b,file=dump.hprof PID)
2、使用jhat、MAT、jvisualvm工具对dump文件进行分析


参考:https://blog.csdn.net/qq_34416191/article/details/118765057

6、面试题

案例一、每日百万订单电商网站,处理订单系统需要什么样的服务器配置?

  1. 首先估算高峰时期有多少订单,比如峰值时期1s有1000个订单,假设每个订单请求响应的数据大概1M;
  2. 那么新生代大小至少是1000*1M=1000M,再以此估算整个对空间大小。

案例二、某网站将服务器堆内存由2G增加到16G,用户反而反馈卡顿严重,为什么?

  1. 首先查一下GC日志,看是否是STW时间变长;
  2. 再看服务器是用的什么垃圾回收器,(PS+PO)内存越大,FGC时间越长;
  3. 选用响应时间快的垃圾回收器,比如CMS,G1。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是JVM  JVMJava Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值