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)¶
打包命令
查看打包内容
解包命令java(openjdk 1.8.0/11/21)¶
查看版本
携带jvm参数运行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进程
查询jvm进程可执行的操作
查看堆信息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 \
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类的依赖性:
jinfo(openjdk 1.8.0/11/21)¶
查看jvm参数,打开jvm参数开关,关闭jvm参数开关
设置jvm参数值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进程,查看线程快照
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;
};
grant codebase "jrt:/jdk.jstatd" {
permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {
permission java.security.AllPermission;
};
nohup jstatd -J-Djava.rmi.server.hostname=10.0.2.15 -J-Djava.security.policy=./jstatd.all.policy -p 1099 &
image.png
pack200(openjdk 1.8.0/11)¶
打包jar包,
rmid(openjdk 1.8.0/11)¶
用于分布式java进程远程通信的工具。
启动rmid进程
启动成功。serialver(openjdk 1.8.0/11/21)¶
生成序列码的工具。
准备测试文件,实现Serializable接口,才可序列化