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个

    

 

posted @ 2022-03-27 14:10  showMeTheCodes  阅读(69)  评论(0编辑  收藏  举报