Java&JVM&OQL&MVN 常用命令与脚本总结
Java&JVM
打 HeapDump
jmap -dump:live,file=heapdump.phrof $pid
或者
jmap -dump:live,file=heapdump.phrof -F $pid
一般情况下,尽量不要使用-F参数。 因为-F使用的是Linux操作系统层面的实现,而不是JVM层面的实现,会导致 打印堆信息很慢。
如果提示第一种方式打印不出来堆的信息,需要增加-F,那么可以先检查下:
- Java应用进程的user_name是否与当前的user_name相同? 如果不同,需要切换为同一个账号。
- Java应用进程的Java路径是否与当前jmap命令的路径相同? 如果不同,需要切换为同一个路径。
打 ThreadDump
jstack $pid > tmp.jstack
注意: 当CPU利用率高或者想看下线程卡在哪里时,最好隔几秒就打一个线程栈,每个线程栈都保留下来
多个线程栈对比起来看,会更能更好地发现问题。
查看消耗CPU时间片最多的线程信息
需要与ThreadDump一起使用,才能定位到具体是Java中哪个线程。
- 查看消耗cpu时间片最多的进程号
// 查看瞬时消耗CPU,倒序排列 top -o %CPU // 查看累计消耗CPU时间片,倒序排列 top -o TIME+
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ top -o %CPU
top - 21:39:35 up 10:52, 1 user, load average: 1.47, 1.36, 1.14
Tasks: 325 total, 4 running, 320 sleeping, 0 stopped, 1 zombie
%Cpu0 : 8.2 us, 4.1 sy, 0.0 ni, 87.4 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu1 : 7.5 us, 3.8 sy, 0.0 ni, 88.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 11.6 us, 2.7 sy, 0.0 ni, 85.4 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
%Cpu3 : 8.4 us, 3.0 sy, 0.0 ni, 88.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7823.4 total, 172.0 free, 5254.4 used, 2397.0 buff/cache
MiB Swap: 2048.0 total, 252.2 free, 1795.7 used. 1107.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2318 davywal+ 20 0 5178536 247920 52372 R 12.5 3.1 24:33.00 gnome-shell
2099 davywal+ 20 0 1008428 112204 78172 R 11.2 1.4 23:31.71 Xorg
6521 davywal+ 20 0 868244 35580 23924 R 5.9 0.4 0:38.61 gnome-terminal-
5308 davywal+ 20 0 6370752 517952 219108 S 2.6 6.5 39:38.79 firefox
- 查看进程下消耗时间片最多的线程号
top -Hp $pid -o %CPU
top -Hp $pid -o TIME+
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ top -Hp 2318
top - 21:42:00 up 10:55, 1 user, load average: 1.08, 1.38, 1.19
Threads: 15 total, 0 running, 15 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.7 us, 1.9 sy, 0.0 ni, 92.3 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 7823.4 total, 158.1 free, 5264.5 used, 2400.9 buff/cache
MiB Swap: 2048.0 total, 250.8 free, 1797.2 used. 1092.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2318 davywal+ 20 0 5178588 247724 52288 S 5.7 3.1 24:28.42 gnome-shell
2331 davywal+ 20 0 5178588 247724 52288 S 0.0 3.1 0:00.34 gmain
2335 davywal+ 20 0 5178588 247724 52288 S 0.0 3.1 0:11.10 gdbus
- 将10进制转成16进制
printf '%x\n' $PPID
// 10进制转成16进制
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ printf '%x\n' 2318
90e
// 16进制转成10进制
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ printf '%d\n' 0x90e
2318
- 查看jstack中对应的线程信息
fgrep "0x90e" tmp.jstack -C 50
查看JVM默认HeapSize
java -XX:+PrintFlagsFinal -version | fgrep HeapSize
// 查看java_home, class_path等默认配置与系统环境变量
java -XshowSettings:all
- 如下,默认HeapSize为130023424/1024/1024=124MB
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ java -XX:+PrintFlagsFinal -version | fgrep HeapSize uintx ErgoHeapSizeLimit = 0 {product} uintx HeapSizePerGCThread = 87241520 {product} uintx InitialHeapSize := 130023424 {product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx MaxHeapSize := 2051014656 {product} openjdk version "1.8.0_312" OpenJDK Runtime Environment (build 1.8.0_312-8u312-b07-0ubuntu1~20.04-b07) OpenJDK 64-Bit Server VM (build 25.312-b07, mixed mode)
davywalker@davywalker-ThinkPad-X1-Carbon-4th:~$ java -XshowSettings:all
VM settings:
Max. Heap Size (Estimated): 1.70G
Ergonomics Machine Class: server
Using VM: OpenJDK 64-Bit Server VM
Property settings:
awt.toolkit = sun.awt.X11.XToolkit
file.encoding = UTF-8
file.encoding.pkg = sun.io
OQL
查询某规格类的对象
select * from edu.xmu.service.impl.UserServiceImpl
查询对象某个属性(这里只能根据类, 查到该类下所有对象的属性)
SELECT t.initd, t.initAsyn, toString(t.publicCloud), namespace, toString(t.regionId), toString(t.useNuwa), toString(t.nuwaConfigDns), toString(t.nuwaCluster), toString(t.rootPath) FROM edu.xmu.service.impl.UserServiceImpl t
查询对象某个属性(如何根据对象ID, 精确查询到该对象的某些属性?)
SELECT t.initd, t.initAsyn, toString(t.publicCloud), namespace, toString(t.regionId), toString(t.useNuwa), toString(t.nuwaConfigDns), toString(t.nuwaCluster), toString(t.rootPath) FROM OBJECTS 0x7480633e0 t
根据类的hash地址, 获取对应实例
select * from instanceof 0x733ccc9f0
根据对象hash值获取对象信息
select * from OBJECTS 0xdc2819e0
根据条件筛选出对象信息
select * from edu.xmu.service.impl.UserServiceImpl t where toString(t.hostType)="ddh.ebmec3metest" select * from edu.xmu.service.impl.UserServiceImpl t where toString(t.id)="28745-27"
Maven
下载源代码. 有时候IDE无法自动下载jar包的源代码, 此时使用如下命令就能下载
mvn dependency:sources
编译源码.
mvn clean compile -DskipTests
编译源码, 且把编译的jar包等产物安装到本地Repo中.
mvn clean install -DskipTests
强制重新下载SNAPSHOT包
mvn clean compile -U
不再联网下载依赖, 即offline mode
# 1. 先验证所有依赖都下载到了本地 # mvn dependency:go-offline # 2. 再执行如下命令, 开启offline编译模式 # mvn -o install # mvn -offline install
依赖解析相关
# 把依赖树打印出来 # mvn dependency:tree # 分析无用的依赖 # mvn dependency: analyze # 分析重复的依赖 # mvn dependency:analyze-duplicate # 当使用shell脚本执行jar命令启动项目时, 需要把项目依赖的jar包都放到classpath参数下. # 但人肉一个一个加很麻烦, 执行这个命令就把所有jar包全路径都拼接打印出来. # mvn dependency:build-classpath # 把所有解析好的依赖, 平铺打印 # mvn dependency:resolve # 列出所有配置好的remote repo # mvn dependency:list-repositories # 把项目所有依赖的jar包都拷贝到目标目录下 # mvn dependency:copy-dependencies -DoutputDirectory="~/lib/"