6.1 java 选项 -javaagent、-agentlib、-agentpath

37 篇文章 0 订阅

-javaagent、-agentlib、-agentpath

都是 jvm  启动的时候可以设置的参数,那这些参数都是什么作用呢?

 

-agentlib:libname[=options] 

 用于装载本地lib包;
 其中libname为本地代理库文件名,默认搜索路径为环境变量PATH中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。在Windows平台上jvm搜索本地库名为libname.dll的文件,在linux上jvm搜索本地库名为libname.so的文件,搜索路径环境变量在不同系统上有所不同,比如Solaries上就默认搜索LD_LIBRARY_PATH。
 比如:-agentlib:hprof
 用来获取jvm的运行情况,包括CPU、内存、线程等的运行数据,并可输出到指定文件中;windows中搜索路径为JRE_HOME/bin/hprof.dll。

比如 jni 调用dll 文件,如果dll文件路径不在path变量中指定,就需要 明确用 参数指定出来。

-agentpath:pathname[=options] 
 按全路径装载本地库,不再搜索PATH中的路径;其他功能和agentlib相同;更多的信息待续,在后续的JVMTI部分会详述。

-javaagent:jarpath[=options] 

 指定jvm启动时装入java语言基础设施代理。jarpath文件中的mainfest文件必须有Premain-Class(启动前捆绑时需要), Agent-Class(运行时捆绑时需要)属性。代理类也必须实现公共的静态public static void premain(String agentArgs, Instrumentation inst)方法(和main方法类似)。当jvm初始化时,将按代理类的说明顺序调用premain方法;具体参见java.lang.instrument软件包的描述。

具体的描述参间下面的程序中的注释:

-javaagent 示例

 1 package com.fjn.jdk.jvm.options.javaagent;
 2 
 3 import java.io.IOException;
 4 import java.lang.instrument.Instrumentation;
 5 
 6 import com.sun.tools.attach.AttachNotSupportedException;
 7 
 8 public class CustomAgent {
 9     /**
10      * 如果Agent是通过JVM选项的方式捆绑到程序中,则在JVM初化完毕后,会执行premain方法,premain执行之后才是程序的main方法。
11      * 清单文件中需要指定Premain-Class 
12      * <p>
13      * premain有两种形式,默认会执行1), 如果没有1)则会执行2), 1)和2)只会执行一个<br>
14      * <code>
15      * 1) public static void premain(String agentArgs, Instrumentation instrumentation)<br/>
16      * 2) public static void premain(String agentArgs)
17      * </code></p>
18      * 
19      * @param agentArgs
20      * @param instrumentation
21      */
22     public static void premain(String agentArgs, Instrumentation instrumentation) {
23         System.out
24                 .println("CustomAgent#premain(String agentArgs, Instrumentation instrumentation)");
25         parseAgentArgs(agentArgs);
26     }
27 
28     public static void premain(String agentArgs) {
29         System.out.println("CustomAgent#premain(String agentArgs)");
30         parseAgentArgs(agentArgs);
31     }
32     
32     
33     /**
34      * 如果Agent是在程序运行过程中,动态的捆绑到程序中,则是执行agentmain方法。
35      * 清单文件中要指定 Agent-Class
36      * <p>
37      * agentmain有两种形式,默认会执行1), 如果没有1)则会执行2), 1)和2)只会执行一个<br>
38      * <code>
39      * 1) public static void agentmain(String agentArgs, Instrumentation instrumentation)<br/>
40      * 2) public static void agentmain(String agentArgs)
41      * </code></p>
42      * 
43      * 通过程序捆绑的代码:<br/>
44      * <code>
45      *     VirtualMachine vm=VirtualMachine.attach("PID"); //给指定的进程捆绑agent<br/>
46      *  在得到目标进程的vm后,就可以通过
47      *    vm.loadAgent("agentjar"),vm.loadAgentLibrary(dll), and loadAgentPath(dllPath) 进行捆绑操作了 <br/>
48      *  其中:<br>
49      *        loadAgent是捆绑一个jar文件,
50      *        loadAgentLibrary,loadAgentPath则是捆绑本地方法库(动态连接库)
51      * </code>
52      * 
53      * @param agentArgs
54      * @param inst
55      */
56     public static void agentmain(String agentArgs, Instrumentation inst) {
57         System.out
58                 .println("CustomAgent#agentmain(String agentArgs, Instrumentation instrumentation)");
59         parseAgentArgs(agentArgs);
60     }
61 
62     public static void agentmain(String agentArgs) {
63         System.out.println("CustomAgent#agentmain(String agentArgs)");
64         parseAgentArgs(agentArgs);
65     }
66 
67     /**
68      * 不论是premain,还在agentmain,都可以指定参数,参数是一个字符串,具体怎么解析,是程序自己的事
69      * @param agentArgs
70      * @return
71      * @throws IOException 
72      * @throws AttachNotSupportedException 
73      */
74     private static boolean parseAgentArgs(String agentArgs) {
75         boolean hasArgs = false;
76         if (agentArgs != null && !agentArgs.isEmpty()) {
77             System.out.println("agentArgs is : " + agentArgs);
78             hasArgs = true;
79         } else {
80             System.out.println("has no agentArgs .");
81         }
82 
83         return hasArgs;
84     }
85 }

复制代码

将该类打包成customagent.jar,放到D盘根目录下,

清单文件:

Manifest-Version: 1.0
Premain-Class: com.fjn.jdk.jvm.options.javaagent.CustomAgent
Sealed: true

 

测试代码:

 

package com.fjn.jdk.jvm.options.javaagent;

import org.junit.Test;

public class JavaAgentTest {
    /**
     * 在启动时,使用-javaagent方式加入代理
     * <code>
     * -javaagent:D:/customagent.jar="Here, your can input agent arguments"
     * 如果要指定参数值
     * </code>
     */
    @Test
    public void testPremain(){
        System.out.println("test premain,  sepcial inst...");
    }
}

 

执行结果:

CustomAgent#premain(String agentArgs, Instrumentation instrumentation)
agentArgs is : Here, your can input agent arguments
test premain,  sepcial inst...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值