• jinfo介绍


    1. jinfo

    1.1 简介

    jinfo用于打印java的配置信息,这些配置信息包括:

    • java system properties
    • jvm命令行参数

    通过查看这些配置信息,可以了解java进程的运行时环境,例如加载类的顺序、jvm配置情况等。

    1.2 使用

    • jinfo pid . 即不加参数,jinfo后面直接跟进程id。会同时打印jvm命令行参数和java system properties
    • jinfo -flags pid . 只打印jvm命令行参数
    • jinfo -sysprops pid . 只打印java system properties

    举例来说,我们运行如下java程序

    java -jar -Dtest test-1.0-SNAPSHOT.jar &

    其中配置了一个jvm命令行参数-Dtest,注意jvm命令行参数要再jar包前面,否则就成为了main函数的参数了。 使用

    jps -lm

    查看进程id,这里得到的进程id是3107778,使用

    jinfo 3107778

    打印进程的配置信息,包括jvm参数和java system properties。打印结果大致如下:

    Attaching to process ID 3107778, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.131-b11
    Java System Properties:  // 第一部分: Java System Properties
    
    java.runtime.name = Java(TM) SE Runtime Environment
    java.vm.version = 25.131-b11
    test = // 重点
    ....// 忽略中间的system properties
    
    sun.io.unicode.encoding = UnicodeLittle
    sun.cpu.endian = little
    sun.cpu.isalist =
    
    VM Flags: // 第二部分:jvm 参数
    Non-default VM flags: -XX:CICompilerCount=15 -XX:InitialHeapSize=2147483648 -XX:MaxHeapSize=32210157568 -XX:MaxNewSize=10736369664 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=715653120 -XX:OldSize=1431830528 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
    Command line:  -Dtest  // jvm命令行参数
    

    2. java system properties

    在平常的一些项目中,我们会使用Properties来保存一些配置信息。同样在java本身也会用Properties来保存java平台的配置信息,这个就是java system properties。System properties主要包含了current user、the current version of the Java runtime、jvm加载的类的路径等信息。

    这个Properties就在java.lang.System类中。可以通过查看代码看到System中有个props的属性,这个便是刚才提到的java system properties:

    public final class System {
        //....
        /**
         * System properties. The following properties are guaranteed to be defined:
         * <dl>
         * <dt>java.version         <dd>Java version number
         * <dt>java.vendor          <dd>Java vendor specific string
         * <dt>java.vendor.url      <dd>Java vendor URL
         * <dt>java.home            <dd>Java installation directory
         * <dt>java.class.version   <dd>Java class version number
         * <dt>java.class.path      <dd>Java classpath
         * <dt>os.name              <dd>Operating System Name
         * <dt>os.arch              <dd>Operating System Architecture
         * <dt>os.version           <dd>Operating System Version
         * <dt>file.separator       <dd>File separator ("/" on Unix)
         * <dt>path.separator       <dd>Path separator (":" on Unix)
         * <dt>line.separator       <dd>Line separator ("
    " on Unix)
         * <dt>user.name            <dd>User account name
         * <dt>user.home            <dd>User home directory
         * <dt>user.dir             <dd>User's current working directory
         * </dl>
         */
    
        private static Properties props;
        //...
    }
    

    System提供了相应的get/set方法来修改该类,但是使用set修改System properties被视为是危险的动作,而且会有一些安全限制。那么如果我们想在java启动的时候通过jvm命令行参数来配置system properties应该怎么做呢?答案是使用类似上面启动java程序的参数,即

    -Dkey=value

    这样的格式。如果不写=value,则得到的为空字符串。例如上面提到的启动java程序,配置了-Dtest:

    java -jar -Dtest test-1.0-SNAPSHOT.jar &

    在其jinfo的输出中,我们可以看到jvm命令行参数是-Dtest,同时在system properties中存在“test=”的properties项。

    假设上述程序main函数如下:

    public static void main(String[] args) throws Exception {
            String s = System.getProperties().getProperty("test");
            if (s == null) {
                System.out.println("null");
            }
            System.out.println("DDD " + s);
    }
    

    则得到s为"",最终打印结果是,如果配置启动命令为

    java -jar -Dtest=aaa test-1.0-SNAPSHOT.jar &

    则上述代码运行结果为DDD aaa。 如果value有空格,则需要加引号(e.g. -Dfoo="foo bar")

    3. 参考

    1. jinfo man page
    2. https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html
    3. https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
  • 相关阅读:
    读书笔记:Visual Studio DSL工具特定领域开发指南
    OpenTest:教你在自动化脚本中增加选择文件的支持
    MetaModelEngine:域模型定义
    WPF:从WPF Diagram Designer Part 2学习面板、缩略图、框线选择和工具箱
    2010年8月blog汇总:敏捷个人和OpenExpressApp之建模支持
    2010年7月blog汇总:OpenTest、MetaModelEngine和敏捷个人
    101与金根回顾敏捷个人:(69)《幸运的秘密》
    MetaModelEngine:模型存储的概要说明
    故事:用户凭什么跟你走
    MDSF:软件工厂(Software factory)介绍
  • 原文地址:https://www.cnblogs.com/set-cookie/p/10947272.html
Copyright © 2020-2023  润新知