Skip to content

openjdk 常用工具验证

汇总

测试环境 openjdk1.8.0,openjdk11:qem8.0 riscv OpenEuler22.03,

openjdk21:qemu9.2,riscv openEuler24.03

√表示测试通过

工具 openjdk1.8.0 openjdk11 openjdk-21
alt-java openjdk1.8.0中没有alt-java工具 openjdk11中没有alt-java工具 openjdk21中没有alt-java工具
jar
java
javadoc
jcmd
jdb
jdeps
jhsdb openjdk1.8.0中没有jhsdb工具(但是分别提供了clhsdb和hsdb两个工具)
jinfo
jlink openjdk1.8.0中没有jlink工具
jmod openjdk1.8.0中没有jmod工具
jrunscript 有但移除了自带的引擎Nashorn,其支持的新引擎GraalVM尚未支持riscv
jstack
jstatd
pack200 openjdk21中没有pack200
rmid openjdk21中没有rmid
serialver
jvisualvm openjdk1.8.0中没有jvisualvm工具 openjdk11中没有jvisualvm工具 openjdk21中没有jvisualvm工具
jaotc openjdk1.8.0中没有jaotc工具 未实现aot功能 openjdk21中没有jaotc工具

测试详情

jhsdb(openjdk11 / 21)

用于查看运行中的java进程的信息,使用 jhsdb clhsdb --pid 968 可打开jhsdb命令行,测试universe命令如下:

openjdk11:

[root@openEuler-riscv64 openeuler]# jhsdb clhsdb --pid 968
Attaching to process 968, please wait...
Warning: Nashorn engine is planned to be removed from a future JDK release
javax.script.ScriptException: TypeError: sapkg.runtime.VM.getVM is not a function in sa.js at line number 54
javax.script.ScriptException: TypeError: sapkg.runtime.VM.getVM is not a function in sa.js at line number 54
Warning! JS Engine can't start, some commands will not be available.
hsdb> universe
Heap Parameters:
garbage-first heap [0x00000006e5800000, 0x0000000800000000] region size 1024K
G1 Heap:
   regions  = 4520
   capacity = 4739563520 (4520.0MB)
   used     = 663462480 (632.7271270751953MB)
   free     = 4076101040 (3887.2728729248047MB)
   13.998387767150339% used
G1 Young Generation:
Eden Space:
   regions  = 123
   capacity = 1617952768 (1543.0MB)
   used     = 128974848 (123.0MB)
   free     = 1488977920 (1420.0MB)
   7.971484121840571% used
Survivor Space:
   regions  = 2
   capacity = 2097152 (2.0MB)
   used     = 2097152 (2.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation:
   regions  = 510
   capacity = 952107008 (908.0MB)
   used     = 532390480 (507.7271270751953MB)
   free     = 419716528 (400.2728729248047MB)
   55.91708447964706% used
hsdb>

openjdk21:

[root@localhost ~]# jhsdb clhsdb --pid 3607
Attaching to process 3607, please wait...
hsdb> universe
Heap Parameters:
ParallelScavengeHeap [ PSYoungGen [ eden =  [0x00000007aab00000,0x00000007f3a00000,0x00000007f3a00000] , from =  [0x00000007f3a00000,0x00000007f82a8160,0x00000007f9d00000] , to =  [0x00000007f9d00000,0x00000007f9d00000,0x0000000800000000]  ] PSOldGen [  [0x0000000700000000,0x0000000753f2ad98,0x00000007aab00000]  ]  ] hsdb>
help命令可查看支持的hsdb命令。

jlink(openjdk11/ 21)

jlink用于创建小型jre,测试流程:

openjdk11:

jar -cvfe temp.jar com.example.Temp com ##将编译好的代码打包为jar包
jdeps --list-deps temp.jar ##检查依赖
jlink --output temp-mini-jre --add-modules java.base --module-path=/usr/lib/jvm/java-11-openjdk/jmods ##根据依赖生成小型jre

openjdk21:

[root@localhost specjbb-src]# jlink --output temp-mini-jre --add-modules java.base --module-path=/usr/lib/jvm/java-21-openjdk/jmods
[root@localhost specjbb-src]# ls temp-mini-jre/
bin  conf  include  legal  lib  man  release

jmod(openjdk11/21)

用于生成jmod模块。

先创建模块化的代码:在同一个包除了编写普通的类还要编写module-info.java

openjdk11:

模块化编译:

javac -d mods/com.example src/module-info.java src/com/example/Temp.java
image.png

运行模块:

java --module-path mods -m com.example/com.example.Temp

测试把模块生成为jmod模块:

jmod create temp.jmod --class-path mods/com.example/

openjdk21:

[root@localhost my-pro]# javac -d mods src/module1/module-info.java src/module1/Main.java
src/module1/module-info.java:1: warning: [module] module name component module1 should avoid terminal digits
[root@localhost my-pro]# ls mods/module
module1/           module-info.class
[root@localhost my-pro]# ls mods/module1/
Main.class
[root@localhost my-pro]# java --module-path mods -m module1/module1.Main
Hello, World!

jar(openjdk 1.8.0/11/21)

打包命令

jar -cvf

查看打包内容

jar -tvf
解包命令
jar -xvf

java(openjdk 1.8.0/11/21)

查看版本

java -version

携带jvm参数运行jar包

java -Xms64g -Xmx64g -Xmn50g  -jar ../specjbb2015.jar

javadoc(openjdk 1.8.0/11/21)

生成doc文档 javadoc Main.java

[root@localhost my-pro]# javadoc src/module1/Main.java
Loading source file src/module1/Main.java...
Constructing Javadoc information...
Building index for all the packages and classes...
Standard Doclet version 21.0.2+12
Building tree for all the packages and classes...
Generating ./module1/Main.html...
src/module1/Main.java:3: warning: no comment
public class Main {
       ^
src/module1/Main.java:3: warning: use of default constructor, which does not provide a comment
public class Main {
       ^
src/module1/Main.java:4: warning: no comment
    public static void main(String[] args) {
                       ^
Generating ./module1/package-summary.html...
Generating ./module1/package-tree.html...
Generating ./overview-tree.html...
Building index for all classes...
Generating ./allclasses-index.html...
Generating ./allpackages-index.html...
Generating ./index-all.html...
Generating ./search.html...
Generating ./index.html...
Generating ./help-doc.html...
3 warnings

jcmd(openjdk 1.8.0/11/21)

查看运行中的java进程

jcmd -l

查询jvm进程可执行的操作

jcmd pid help
image.png
查看堆信息
jcmd 930 GC.heap_info  ## 查看堆信息

jdb(openjdk 1.8.0/11/21)

用于调试java进程。

运行jar包时添加供调试用的socket端口

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \
        -jar SPECjvm2008.jar -ict -ikv \
使用jdb调试正在运行的java应用

openjdk11:

[root@openEuler-riscv64 specjvm]# jdb -attach 5005  ##attach到设置好的端口
Set uncaught java.lang.Throwable
> stop in spec.benchmarks.helloworld.Main  ##在某个类上添加断点
Deferring breakpoint spec.benchmarks.helloworld.Main.
It will be set after the class is loaded.
> clear                                    ##查看设置的断点
Breakpoints set:
        breakpoint spec.benchmarks.helloworld.Main
>

openjdk21:

[root@localhost specjbb]# jdb attach 5005
Initializing jdb ...
> stop in module1.Main
Deferring breakpoint module1.Main.
It will be set after the class is loaded.
> clear
Breakpoints set:
        breakpoint module1.Main
>

jdeps(openjdk 1.8.0/11/21)

查看jar包或java类的依赖性:

jdeps -s SPECjvm2008.jar

jinfo(openjdk 1.8.0/11/21)

查看jvm参数,打开jvm参数开关,关闭jvm参数开关

jinfo -flag PrintGC 1085
jinfo -flag +PrintGC 1085
jinfo -flag -PrintGC 1085
设置jvm参数值
jinfo -flag ConcGCThreads=5 1085

jrunscript(openjdk 1.8.0/11/21)

启动jrunscript命令行,执行javascript/groovy/ruby代码

openjdk8/11:

[root@openEuler-riscv64 specjvm]# jrunscript
Warning: Nashorn engine is planned to be removed from a future JDK release
nashorn> var test = "hello world!";
nashorn> test
hello world!
nashorn>

openjdk21:

[root@localhost specjbb]# jrunscript
script engine for language js can not be found
nashorn引擎已经被移除,需要自己安装GraalVM引擎,该引擎暂未支持riscv:

image.png

jstack (openjdk 1.8.0/11/21)

attach到正在运行的java进程,查看线程快照

jstack -l pid
image.png

jstatd(openjdk 1.8.0/11/21)

相当于jstat后台进程,可用于远程连接查看进程信息,比如远程打开visualVM连接jstatd端口,可查看可视化的内存使用情况等信息。

创建权限赋予文件jstatd.all.policy

openjdk1.8.0写入如下内容:

grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk/lib/tools.jar" {
        permission java.security.AllPermission;
};
openjdk11/21写入如下内容:
grant codebase "jrt:/jdk.jstatd" {
        permission java.security.AllPermission;
};

grant codebase "jrt:/jdk.internal.jvmstat" {
       permission java.security.AllPermission;
};
启动jstatd,
nohup jstatd -J-Djava.rmi.server.hostname=10.0.2.15 -J-Djava.security.policy=./jstatd.all.policy -p 1099 &
image.png
已经启动成功,可以远程连接1099端口,查看jvm进程的具体信息

pack200(openjdk 1.8.0/11)

打包jar包,

pack200 -g temp.pack SPECjvm2008.jar
pack200 --gzip temp.gz SPECjvm2008.jar
image.png

rmid(openjdk 1.8.0/11)

用于分布式java进程远程通信的工具。

启动rmid进程

nohup rmid -J-Dsun.rmi.activation.execPolicy=none -port 1099 &
image.png
启动成功。

serialver(openjdk 1.8.0/11/21)

生成序列码的工具。

准备测试文件,实现Serializable接口,才可序列化

package com.example;
import java.io.Serializable;
public class Temp implements Serializable{
    public static void main(String[] args) {
        System.out.println("Hello wold!");
    }
}

serialver com.example.Temp ##生成序列化id
image.png