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 [文件名]

 

posted @ 2021-07-24 14:11  扰扰  阅读(156)  评论(0编辑  收藏  举报