CPU&内存GC分析和JVM调参
一、cpu占用过高分析
1、通过ps命令查询cpu占用过高的进程pid
top -c
2、通过top -H -p <PID>命令查看具体的线程id,记住占用高的线程TID
top -H -p <PID>
3、导出堆栈日志文件
jstack -l <pid> >> jstackLog.out
4、线程TID转16进制
printf "0x%x\n" <线程TID>
二、导出dump内存文件
jmap -dump:format=b,file=test.dump 【pid】
三、jmap -heap 命令结果分析(1.8和1.7会有区别)
jmap -heap pid Attaching to process ID 3764, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.171-b11 using thread-local object allocation. Parallel GC with 8 thread(s) //采用Parallel GC Heap Configuration: MinHeapFreeRatio = 0 //JVM最小空闲比率 可由-XX:MinHeapFreeRatio=<n>参数设置, jvm heap 在使用率小于 n 时 ,heap 进行收缩 MaxHeapFreeRatio = 100 //JVM最大空闲比率 可由-XX:MaxHeapFreeRatio=<n>参数设置, jvm heap 在使用率大于 n 时 ,heap 进行扩张 MaxHeapSize = 2095054848 (1998.0MB) //JVM堆的最大大小 可由-XX:MaxHeapSize=<n>参数设置 NewSize = 44040192 (42.0MB) //JVM新生代的默认大小 可由-XX:NewSize=<n>参数设置 MaxNewSize = 698351616 (666.0MB) //JVM新生代的最大大小 可由-XX:MaxNewSize=<n>参数设置 OldSize = 88080384 (84.0MB) //JVM老生代的默认大小 可由-XX:OldSize=<n>参数设置 NewRatio = 2 //新生代:老生代(的大小)=1:2 可由-XX:NewRatio=<n>参数指定New Generation与Old Generation heap size的比例。 SurvivorRatio = 8 //survivor:eden = 1:8,即survivor space是新生代大小的1/(8+2)[因为有两个survivor区域] 可由-XX:SurvivorRatio=<n>参数设置 MetaspaceSize = 21807104 (20.796875MB) //元空间的默认大小,超过此值就会触发Full GC 可由-XX:MetaspaceSize=<n>参数设置 CompressedClassSpaceSize = 1073741824 (1024.0MB) //类指针压缩空间的默认大小 可由-XX:CompressedClassSpaceSize=<n>参数设置 MaxMetaspaceSize = 17592186044415 MB //元空间的最大大小 可由-XX:MaxMetaspaceSize=<n>参数设置 G1HeapRegionSize = 0 (0.0MB) //使用G1垃圾收集器的时候,堆被分割的大小 可由-XX:G1HeapRegionSize=<n>参数设置 Heap Usage: PS Young Generation //新生代区域分配情况 Eden Space: //Eden区域分配情况 capacity = 89653248 (85.5MB) used = 8946488 (8.532035827636719MB) free = 80706760 (76.96796417236328MB) 9.978989272089729% used From Space: //其中一个Survivor区域分配情况 capacity = 42467328 (40.5MB) used = 15497496 (14.779563903808594MB) free = 26969832 (25.720436096191406MB) 36.49275037977431% used To Space: //另一个Survivor区域分配情况 capacity = 42991616 (41.0MB) used = 0 (0.0MB) free = 42991616 (41.0MB) 0.0% used PS Old Generation //老生代区域分配情况 capacity = 154664960 (147.5MB) used = 98556712 (93.99100494384766MB) free = 56108248 (53.508995056152344MB) 63.722715216167906% used 1819 interned Strings occupying 163384 bytes.
四、微调JVM启动参数
JVM参数大致可以分为三类
-
标准指令:
-
开头,这些是所有的HotSpot
都支持的参数。可以用java -help
打印出来。 -
非标准指令:
-X
开头,这些指令通常是跟特定的HotSpot
版本对应的。可以用java -X
打印出来。 -
不稳定参数:
-XX
开头,这一类参数是跟特定HotSpot
版本对应的,并且变化非常大。详细的文档资料非常少。
在JDK1.8版本下有几个常用的不稳定指令
java -XX:+PrintCommandLineFlags
:查看当前命令的不稳定指令java -XX:+PrintFlagsInitial
:查看所有不稳定指令的默认值java -XX:+PrintFlagsFinal
:查看所有不稳定指令最终生效的实际值
堆内存默认分配:新生区占1/3,老年区占2/3 (新生区分为3块 Eden、From(S0)、To(S1),默认占比是 8:1:1)
java
-Xms64m #JVM启动时的初始堆大小
-Xmx128m #最大堆大小
-Xmn64m #年轻代的大小,其余的空间是老年代
-XX:MaxMetaspaceSize=128m #
-XX:CompressedClassSpaceSize=64m #使用 -XX:CompressedClassSpaceSize 设置为压缩类空间保留的最大内存。
-Xss256k #线程
-XX:InitialCodeCacheSize=4m #
-XX:ReservedCodeCacheSize=8m # 这是由 JIT(即时)编译器编译为本地代码的本机代码(如JNI)或 Java 方法的空间
-XX:MaxDirectMemorySize=16m
-jar app.jar
# -XX:+DisableExplicitGC
# -XX:+HeapDumpOnOutOfMemoryError
# -XX:HeapDumpPath=/usr/local/app/oom
# -XX:+PrintGCDetails -Xloggc:gc.log
# -Xms: 设置堆初始化内存大小, 默认是 1/64 # -Xmx: 设置最大分配内存大小, 默认是 1/4 # -Xss: 线程栈大小 # -XX:MetaspaceSize: 元空间大小 # -XX:MaxMetaspaceSize: 元空间最大大小 java -Xms2G -Xmx2G -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar # -XX:MaxGCPauseMillis: GC进行STW的最大停顿时间, JVM将尽可能(但不保证)停顿小于这个时间 # -XX:+UseG1GC 使用G1垃圾收集器 java -Xms2G -Xmx2G -Xss1M -XX:+UseG1GC -XX:MaxGCPauseMillis=100ms -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar app.jar
五、查看JVM的一些默认参数
[root@tes /]# /usr/java/jdk1.7.0_80/bin/java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=394833984 -XX:MaxHeapSize=6317343744 -XX:+PrintCommandLineFlags -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
六、查看磁盘IO
查看磁盘占用 df -h 安装磁盘工具 yum install sysstat 查看磁盘io 使用iostat -d -k 2 查看IO情况: -k:已kb为单位显示读写信息 -m:已mb为单位显示读写信息 查看io占用百分比 iostat -xdm 1 sysstat命令 pidstat查看磁盘IO进程占用情况 pidstat -d 1 (每1秒打印一次使用磁盘io的进程及io速度)
七、大文件处理
分割大文件
split -b 512000k -d wx.log wx.log.
split [-b ][-C ][-][-l][-d][要切割的文件][输出文件名前缀][-a ]
-b<字节>:指定按多少字节进行拆分,也可以指定 K、M、G、T 等单位。
-<行数>或-l<行数>:指定每多少行要拆分成一个文件。
输出文件名前缀:设置拆分后的文件的名称前缀,split 会自动在前缀后加上编号,默认从 aa 开始。
-a<后缀长度>:默认的后缀长度是 2,也就是按 aa、ab、ac 这样的格式依次编号。
-d : 后缀使用数字自增
合并文件linux,windows
cat wx.log.* > wx_new.log
copy wx.log.* wx_new.log
查看MD5值
md5sum [文件名]