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

2020-05-30  本文已影响0人  Y了个J

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

上一篇下一篇

猜你喜欢

热点阅读