美文网首页
【JAVA】问题定位和参数调优

【JAVA】问题定位和参数调优

作者: Y了个J | 来源:发表于2020-05-30 23:16 被阅读0次

    https://www.jianshu.com/p/8c947e2694c2

    通过 jps -l 找到项目的进程号, 如下是16555

    ssj@ssj-PC$: jps -l
    16555 com.shujie.threadtroubleshooting.ThreadTroubleshootingApplication
    

    通过jstack dump线程信息,如下会将线程信息dump到一个名为thread.txt的文件中

    jstack 16555 > thread.txt
    

    JVM垃圾回收的时候如何确定垃圾?什么是GC Roots
    如何查看JVM系统默认参数配置
    平时工作用过的JVM常用配置参数有哪些?
    强引用、软引用、弱引用、虚引用分别是什么
    你对OOM的认识,产生OOM的几种情况
    GC垃圾回收算法和垃圾收集器的关系
    怎么查看服务器默认的垃圾收集器是哪个?生产上如何配置垃圾收集器
    谈谈你对G1垃圾收集器的认识

    生产服务器变慢,诊断思路和性能评估
    网络不好,大量磁盘IO,慢sql,死锁,依赖的其他服务慢,内存占用过多,垃圾回收频繁,STW停顿时间长,线程太多,上下文切换频繁,cpu占用过多,比如出现了死循环。

    top  #查看pid,cpu占用和MEM指标
    vmstat -n 2 3  #每两秒采样一次,采样三次
    mpstat -P ALL 2  #每两秒采样一次,查看所有的cpu使用情况
    pidstat -u 1 -p 3780  #每两一采样一次,查看进程的cou使用情况
    
    free -m  #查看系统的内存
    
    pidstat -p 进程号 -r 采样间隔秒数
    pidstat -p 3780 -r 1
    
    df -h   #查看硬盘使用情况
    
    iostat  #查看磁盘io
    pidstat -d 2 -p 3780
    
    ifstat #查看网络io
    

    生产环境CPU占用过高,怎么分析和定位

    1.先用top找出占用cpu比较高的pid
    2.ps -ef 或者 jps -l 进一步定位,得知是什么后台程序占用cpu高
    3.定位到具体的线程或者代码,ps -mp pid -o THREAD,tid,time
    4.将tid转换为16进制格式(英文小写格式)    print "%x\n" tid
    5.jstack pid | grep tid(第4步转换后的) -A60
    jstack pid | grep 13ee -A60
    

    JDK自带的JVM监控和性能分析工具有哪些,你一般怎么用的?

    指定参数启动
    java -server -Xms1024m -Xmx1024m -XX:UseG1GC -jar xxxx.jar

    jps -l #查看java进程编号

    LuosadeMac-mini:~ yangjun$ jps -l
    3504 org.jetbrains.idea.maven.server.RemoteMavenServer
    3285 
    3514 org.jetbrains.jps.cmdline.Launcher
    3515 cn.springcloud.fix.eureka.EurekaServerApplication
    3517 sun.tools.jps.Jps
    

    jstack 3515 #3515是进程号,查看栈运行情况

    jinfo -l #查看当前运行程序的配置
    jinfo -flags 3515
    jinfo -flag PrintGCDetails 3515 #查看3515进程是否开启PrintGCDetails
    jinfo -flag MetaspaceSize 3515
    jinfo -flag UseSerialGC 3515
    jinfo -flag UseParallelGC 3515

    (base) LuosadeMac-mini:~ yangjun$ jinfo -flag PrintGCDetails 3515
    -XX:-PrintGCDetails    
    (base) LuosadeMac-mini:~ yangjun$ jinfo -flag MetaspaceSize 3515
    -XX:MetaspaceSize=21807104
    (base) LuosadeMac-mini:~ yangjun$ jinfo -flag UseSerialGC 3515
    -XX:-UseSerialGC
    (base) LuosadeMac-mini:~ yangjun$ jinfo -flag UseParallelGC 3515
    -XX:+UseParallelGC
    (base) LuosadeMac-mini:~ yangjun$ jinfo -flags 3515
    Attaching to process ID 3515, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.102-b14
    Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:MaxNewSize=715653120 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
    Command line:  -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=57032:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8
    

    boolean类型设置

    -XX:+PrintGCDetails 添加启动参数,+表示开启

    KV设置类型

    -XX: MetaspaceSize=21807104

    查看JVM参数
    java -XX:+PrintFlagsInitial

    JVM参数
    -Xms 初始内存大小,默认为物理内存的1/64
    -Xmx 最大分配内存,默认是物理内存1/4
    -Xss 设置单线程栈大小,一般为512k~1024k

    常用参数.png 新生代参数.png 新生代和老年代.png

    强引用、软引用、弱引用

    强引用在发生OOM时也不会被回收,会导致内存泄露
    软引用在内存足够的情况下不回收,内存不够的时候会被回收
    弱引用不管内存够不够,只要有gc就会被回收

    软引用和弱引用应用场景
    如果一个应用要加载大量本地图片
    每次都从硬盘读取会严重影响性能
    都加载到内存又可能造成内存溢出
    此时可以使用软引用或者弱引用,放到Map里,或使用WeakHashMap

    垃圾回收

    查看服务器默认的垃圾回收器
    -XX:+UseParallelGC

    引用计数
    复制拷贝
    标记清除
    标记整理

    串行回收
    并行回收
    并发回收
    G1

    CMS收集器(并发标记清除),优点:停顿时间少,缺点:内存碎片,耗费cpu

    相关文章

      网友评论

          本文标题:【JAVA】问题定位和参数调优

          本文链接:https://www.haomeiwen.com/subject/hodgvqtx.html