openjdk-jinfo源码分析

        jinfo是Java Virtual Machine Configuration Info Tool的缩写,是JDK自带的一个命令行工具,用于查看和修改Java虚拟机的运行时参数。jinfo命令可以用于查询Java虚拟机的启动参数、系统属性、环境变量等信息,也可以用于修改Java虚拟机的运行时参数。

使用方法

[root@localhost ~]# jinfo -help
Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         输出指定名称的VM选项
    -flag [+|-]<name>    启动或者关闭指定名称的VM选项
    -flag <name>=<value> 将指定名称的VM选项设置成value数值
    -flags               输出VM选项值
    -sysprops            输出虚拟机系统属性值
    <no option>          输出虚拟机参数值和JAVA系统属性值
    -h | -help           打印此帮助消息

源码分析

        在HosSpot的runtime模块中,用来传递JVM参数和选项信息的是Arguments类。应用程序jinfo通过连接机制连接到JVM进程,通过应用接口读取C++类Arguments信息,并将数据成员映射到JAVA同名类Arguments。

        实现jinfo的主程序如下所示:

基础类
/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java
主程序类
/jdk/src/share/classes/sun/tools/jinfo/JInfo.java

        启动jinfo后,连接到正在运行的目标JVM上,通过读取和解析映射过来的指定的Arguments成员,变可以得到相应的JVM配置信息。

        runTool()函数映射到了/jdk/src/share/classes/sun/tools/jinfo/JInfo.java中的main()方法。

        在main()方法中对args参数校验,不通过的会打印使用帮助信息。同时会根据args生成mode。mode主要取值有:

  • MODE_BOTH :flag参数和系统属性都打印
  • MODE_FLAGS :只打印flag参数

  • MODE_SYSPROPS :只打印系统属性

 

        jinfo利用Arguments实现了-flag选项,利用SysPropsDumper实现了-sysprops选项。

-flags选项

        jinfo获取虚拟机相应参数值,只需要读取Arguments成员变量值,这些成员在java类Arguments初始化时已经赋值。初始化方法如下图所示,源码位于hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/Arguments.java。

        jinfo的-flags选项即可通过调用Arguments的get()方法呈现信息。getJVMFlags()和getJVMArgs()分别输出jvmFlagsField和jvmArgsField,即虚拟机flags值和虚拟机参数值。源码位于【hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java】

-sysprops选项

        在Tool.start()中【/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java】,首先会利用agent实现进程的连接,然后启动客户端run()方法,客户端通过自定义run()方法的代码,实现程序自身业务逻辑。

        当jnfo程序运行起来后,将会启动Tool.start()函数,创建HotSpotAgent对象,并根据连接目标类型出发相应的重载attach()函数,使客户端进程连接到目标JVM进程。SysPropsDumper的run()方法如下图所示,源码目录为[/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/SysPropsDumper.java],VM.getVM().getSystemProperties()函数返回了虚拟机属性值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值