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,那么可以先检查下:

  1. Java应用进程的user_name是否与当前的user_name相同? 如果不同,需要切换为同一个账号。
  2. Java应用进程的Java路径是否与当前jmap命令的路径相同? 如果不同,需要切换为同一个路径。

打 ThreadDump

jstack $pid > tmp.jstack

注意: 当CPU利用率高或者想看下线程卡在哪里时,最好隔几秒就打一个线程栈,每个线程栈都保留下来

多个线程栈对比起来看,会更能更好地发现问题。

查看消耗CPU时间片最多的线程信息

需要与ThreadDump一起使用,才能定位到具体是Java中哪个线程。

  1. 查看消耗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                                      
  1. 查看进程下消耗时间片最多的线程号
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                                        
  1. 将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
  1. 查看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

  • 如何使用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/"