6.1 java 选项 -javaagent、-agentlib、-agentpath
来源:互联网 发布:天伟数据恢复中心 编辑:程序博客网 时间:2024/06/05 15:52
-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 agentArgs20 * @param instrumentation21 */22 public static void premain(String agentArgs, Instrumentation instrumentation) {23 System.out24 .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-Class36 * <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 agentArgs54 * @param inst55 */56 public static void agentmain(String agentArgs, Instrumentation inst) {57 System.out58 .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 agentArgs70 * @return71 * @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.0Premain-Class: com.fjn.jdk.jvm.options.javaagent.CustomAgentSealed: 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 argumentstest premain, sepcial inst...
- 6.1 java 选项 -javaagent、-agentlib、-agentpath
- javaagent
- javaagent
- jdk Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- 用javaagent来对java字节码进行变换
- java 与javaAgent读取文本文件中文乱码总结
- javaAgent 参数
- 配置javaagent
- Javaagent学习
- -agentlib和-Xdebug区别
- ubuntu 15.04 Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 问题解决
- JDK报错:Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- 总显示Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar解决办法
- jre运行报Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar的解决办法
- Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar的解决办法
- Java中String类型和其他数据类型之间的转换
- linux下管道破裂的处理
- Docker视频教程 之 熟悉docker-machine及docker常用命令 - 知识林
- Widget的简单应用并适配iOS10
- Mac/Win版:Adobe CC 2017 软件下载(中文/英文版)补丁破解 Adobe Creative Cloud 2017
- 6.1 java 选项 -javaagent、-agentlib、-agentpath
- 用户空间和内核空间通讯之【Netlink 上】
- 使用SpringSession时cookies跨域导致Session不一致问题的解决
- ijkplayer 编译so库过程
- 算法(第四版)——03插入排序
- Runtime Swizzling方法使用补充材料
- Android竖屏视频录制
- 这算是一篇学习计划吧!
- 如何在Docker容器内外互相拷贝数据?