启动命令

Java查看正在运行服务的启动参数,可以使用下面的命令

ps -ef | grep "java"
# 结果如何,可以轻松的看到我们设置的启动参数
root       78048       1  0 Mar28 ?        00:01:23 java -jar /opt/app/xxx/service/xxx.jar --server.port=8080 --spring.profiles.active=prod --logging.file.path=/opt/app/xxx/service/logs

这个命令我们可以清晰的看到我们java服务的启动的参数,但是这可能不是我想要的,我想要的是服务的所有参数,包括JVM相关参数。

启动参数

下面这个命令可以查看所有的启动参数,不止是上面的启动命令设置的一些参数

jinfo 78048

78048是PID号,通过 ps -ef | grep "java" 或者 jps 获取到的,其中 java 就是我们服务名称,可能你需要换成你自己的。我们一起看下jinfo 命令返回的数据,内容比较多,我们详细的一起看下。

Java System Properties:
#Fri Mar 29 17:02:04 CST 2024
java.specification.version=17
sun.jnu.encoding=UTF-8
java.class.path=/opt/app/xxx/service/xxx.jar
java.vm.vendor=Oracle Corporation
LOG_PATH=/opt/app/xxx/service/logs
sun.arch.data.model=64
catalina.useNaming=false
java.vendor.url=https\://java.oracle.com/
user.timezone=Asia/Shanghai
os.name=Linux
java.vm.specification.version=17
user.country=US
sun.java.launcher=SUN_STANDARD
sun.boot.library.path=/home/java/jdk-17.0.10/lib
sun.java.command=/opt/app/foreignreading/service/foreignreading-0.0.1-SNAPSHOT.jar --server.port\=8080 --spring.profiles.active\=prod --logging.file.path\=/opt/app/foreignreading/service/logs
jdk.debug=release
sun.cpu.endian=little
user.home=/root
user.language=en
java.specification.vendor=Oracle Corporation
java.version.date=2024-01-16
java.home=/home/java/jdk-17.0.10
file.separator=/
java.vm.compressedOopsMode=32-bit
line.separator=\n
java.specification.name=Java Platform API Specification
java.vm.specification.vendor=Oracle Corporation
FILE_LOG_CHARSET=UTF-8
java.awt.headless=true
java.protocol.handler.pkgs=org.springframework.boot.loader.net.protocol
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
java.runtime.version=17.0.10+11-LTS-240
user.name=root
path.separator=\:
os.version=4.18.0-348.7.1.el8_5.x86_64
java.runtime.name=Java(TM) SE Runtime Environment
file.encoding=UTF-8
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
LOG_FILE=/opt/app/xxx/service/logs/spring.log
java.vendor.url.bug=https\://bugreport.java.com/bugreport/
java.io.tmpdir=/tmp
catalina.home=/tmp/tomcat.8080.14740814950474420784
java.version=17.0.10
user.dir=/opt/app/xxx/service
os.arch=amd64
java.vm.specification.name=Java Virtual Machine Specification
PID=78048
CONSOLE_LOG_CHARSET=UTF-8
catalina.base=/tmp/tomcat.8080.14740814950474420784
native.encoding=UTF-8
java.library.path=/usr/java/packages/lib\:/usr/lib64\:/lib64\:/lib\:/usr/lib
java.vm.info=mixed mode, sharing
java.vendor=Oracle Corporation
java.vm.version=17.0.10+11-LTS-240
sun.io.unicode.encoding=UnicodeLittle
java.class.version=61.0

VM Flags:
-XX:CICompilerCount=2 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=2 -XX:G1EagerReclaimRemSetThreshold=8 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=60817408 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=947912704 -XX:MaxNewSize=568328192 -XX:MinHeapDeltaBytes=1048576 -XX:MinHeapSize=8388608 -XX:NonNMethodCodeHeapSize=5826188 -XX:NonProfiledCodeHeapSize=122916026 -XX:ProfiledCodeHeapSize=122916026 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=947912704 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

VM Arguments:
java_command: /opt/app/xxx/service/xxx.jar --server.port=8080 --spring.profiles.active=prod --logging.file.path=/opt/app/xxx/service/logs
java_class_path (initial): /opt/app/xxx/service/foreignreading-0.0.1-SNAPSHOT.jar
Launcher Type: SUN_STANDARD

比较简单的参数我们就不过多进行解释,主要看下下面的参数含义:

LOG_PATH:日志路径,可以通过启动参数的--logging.file.path指定。

sun.arch.data.model:32位或者64位的JVM。

catalina.useNaming:它用于指示 Tomcat 是否应该使用 JNDI 命名来管理资源,false不使用。

user.timezone:时区。

sun.java.command:启动命令。

sun.cpu.endian:统的字节序是大端还是小端。

java.class.version:类文件版本。

VM Flags: 虚拟机标志,这里是我们比较关心的重要参数:

-XX:CICompilerCount:用于设置即时编译器(JIT)线程的数量。

-XX:ConcGCThreads:设置并发垃圾收集器的线程数。

-XX:G1ConcRefinementThreads:设置 G1 垃圾收集器的并发引用更新线程数,G1 垃圾收集器使用并发引用更新线程来在应用程序执行期间更新对象引用,简单来说就是在程序运行时维护RememberSet的线程数目

-XX:G1EagerReclaimRemSetThreshold:设置 G1 垃圾收集器的“急切回收”(Eager Reclaim)的RememberSet阈值。

-XX:G1HeapRegionSize: 设置G1 垃圾收集器的Region大小。

-XX:GCDrainStackTargetSize:控制线程标记被保留的数量。

-XX:InitialHeapSize:设置 Java 堆的初始大小。

-XX:MarkStackSize:设置标记堆栈的大小。

-XX:MaxHeapSize:设置 Java 堆的最大大小。

-XX:MaxNewSize:设置新生代的最大大小。

-XX:MinHeapDeltaBytes:设置 Java 堆的最小增量字节数。

-XX:MinHeapSize:设置 Java 堆的最小大小。

-XX:+UseCompressedClassPointers:用于启用类指针压缩(Compressed Class Pointers)。

-XX:+UseCompressedOops:启用指针压缩(Compressed Oops)。

-XX:+UseFastUnorderedTimeStamps:启用快速无序时间戳。

XX:+UseG1GC:启用 G1 垃圾收集器。

VM Arguments:虚拟机参数,启动的时候用户进行设置的参数,这里就不多做解释,比较好理解。

Java代码获取启动参数

ManagementFactory,通过这个我们可以获取VM运行时的一些数据,下面只是一些示例,具体的大家可以自行查看源码注释。