JavaSe:-javaagent,-agentlib,-agentpath
内容简述
-javaagent、-agentlib、-agentpath
-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。
-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 示例
package com.fjn.jdk.jvm.options.javaagent;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import com.sun.tools.attach.AttachNotSupportedException;
public class CustomAgent {
/**
* 如果Agent是通过JVM选项的方式捆绑到程序中,则在JVM初化完毕后,会执行premain方法,premain执行之后才是程序的main方法。
* 清单文件中需要指定Premain-Class 12 * <p>
* premain有两种形式,默认会执行1), 如果没有1)则会执行2), 1)和2)只会执行一个<br>
* <code>
* 1) public static void premain(String agentArgs, Instrumentation instrumentation)<br/>
* 2) public static void premain(String agentArgs)
* </code></p>
*
* @param agentArgs
* @param instrumentation
*/
public static void premain(String agentArgs, Instrumentation instrumentation) {
System.out
.println("CustomAgent#premain(String agentArgs, Instrumentation instrumentation)");
parseAgentArgs(agentArgs);
}
public static void premain(String agentArgs) {
System.out.println("CustomAgent#premain(String agentArgs)");
parseAgentArgs(agentArgs);
}
/**
* 如果Agent是在程序运行过程中,动态的捆绑到程序中,则是执行agentmain方法。
* 清单文件中要指定 Agent-Class
* <p>
* agentmain有两种形式,默认会执行1), 如果没有1)则会执行2), 1)和2)只会执行一个<br>
* <code>
* 1) public static void agentmain(String agentArgs, Instrumentation instrumentation)<br/>
* 2) public static void agentmain(String agentArgs)
* </code></p>
*
* 通过程序捆绑的代码:<br/>
* <code>
* VirtualMachine vm=VirtualMachine.attach("PID"); //给指定的进程捆绑agent<br/>
* 在得到目标进程的vm后,就可以通过
* vm.loadAgent("agentjar"),vm.loadAgentLibrary(dll), and loadAgentPath(dllPath) 进行捆绑操作了 <br/>
* 其中:<br>
* loadAgent是捆绑一个jar文件,
* loadAgentLibrary,loadAgentPath则是捆绑本地方法库(动态连接库)
* </code>
*
* @param agentArgs
* @param inst
*/
public static void agentmain(String agentArgs, Instrumentation inst) {
System.out
.println("CustomAgent#agentmain(String agentArgs, Instrumentation instrumentation)");
parseAgentArgs(agentArgs);
}
public static void agentmain(String agentArgs) {
System.out.println("CustomAgent#agentmain(String agentArgs)");
parseAgentArgs(agentArgs);
}
/**
* 不论是premain,还在agentmain,都可以指定参数,参数是一个字符串,具体怎么解析,是程序自己的事
* @param agentArgs
* @return
* @throws IOException
* @throws AttachNotSupportedException
*/
private static boolean parseAgentArgs(String agentArgs) {
boolean hasArgs = false;
if (agentArgs != null && !agentArgs.isEmpty()) {
System.out.println("agentArgs is : " + agentArgs);
hasArgs = true;
} else {
System.out.println("has no agentArgs .");
}
return hasArgs;
}
}
将该类打包成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...
想要了解动态捆绑机制,可以参考:
JavaSe:-javaagent,-agentlib,-agentpath的更多相关文章
- JVM插码之三:javaagent介绍及javassist介绍
本文介绍一下,当下比较基础但是使用场景却很多的一种技术,稍微偏底层点,就是字节码插庄技术了...,如果之前大家熟悉了asm,cglib以及javassit等技术,那么下面说的就很简单了...,因为下面 ...
- JavaSe:Properties文件格式
Properties文件格式说明 Properties继承自Hashtable,是由一组key-value的集合. 在Java中,常用properties文件作为配置文件.它的格式是什么样的呢? 下图 ...
- JavaSe:ThreadLocal
JDK中有一个ThreadLocal类,使用很方便,但是却很容易出现问题.究其原因, 就是对ThreadLocal理解不到位.最近项目中,出现了内存泄漏的问题.其中就有同事在使用ThreadLocal ...
- JavaSe:Cookie 管理的API介绍
CookieManager 在使用HttpURLConnection中,并没有关于Cookie的管理.如果使用Java程序时,怎么管理cookie呢? Cookie案例 1. User Agent - ...
- JavaSe:Comparator
今天,公司里有一个萌萌的妹子问我java 中的comparator是怎么回事.参数分别是什么,返回值又是什么,为此,我写了一个简单的程序告诉了她: public static void main (S ...
- JavaSe:代码块执行顺序
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. //普通代码块:在方法或语句中出现 ...
- JavaSe:UncaughtExceptionHandler
Java中,出现对于异常的处理,通常是使用try{}catch()来捕获处理的.但是在使用trycatch时,未必会将所有的异常都捕获到,所以方法声明时可以有throws xxxException. ...
- JavaSE:关键字(全)
访问控制: private 访问控制方式:私有的 protected 访问控制方式:受保护的 public 访问控制方式:公共的 类.方法和变量修饰符: abstract 声明抽象,表明类或者成员方法 ...
- JavaSE:数据类型之间的转换(附常见面试题)
数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...
随机推荐
- js 对Array的补充
Array.form的用法 1.可以将各种值转为真正的数组,并且还提供map功能.这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的 ...
- 如何为RD网关创建自建签名的证书
创建安全的RD网关是一件非常好的事情,这样可以在公网环境下直接远程接入内部的已开启远程访问的主机服务器. 建立这个安全的RD网关需要的材料有RD网关本身,以及一个证书.由于一般情况下这些在RD网关后面 ...
- c/c++系列的运算符优先级总结
经常写程序的时候,遇到运算符优先级的问题,令我汗颜的是,查书的次数挺多的……狠狠心,总结下.不过还要结合大量的编程实践来深入脑海. 1.首先永远忘不了的是,逗号运算符级别最低,毫无争议的还有()括起来 ...
- 奇妙的NULL值,你知道多少
<NULL值的多义性分析> 谈到NULL值,很多人都是很熟悉,但是深入了解后,又感觉到陌生,对其含义和用法,都无法很准确的理解.NULL在数据库和编程语言中,存在的意义和附带的含义不同. ...
- 浅谈2D游戏设计模式3 - 冒险地图之美(1)
冒险岛之所以能长久的存在,很大一部分原因是因为它的美工设计的非常的精细,以及独特,那么独特以及美究竟体现在哪些方面呢? 今天我就带大家来分析几幅地图吧. 好吧,我们就拿上面这幅美景来分析吧. 1.阳光 ...
- JS实现带复选框的下拉菜单
这段时间在做后台的时候需要一个可以复选的下拉菜单,用到的是easyUI中的combo的Demo,先看看官方easyUI:http://www.jeasyui.com/documentation/ind ...
- C#中实现对象间的更新操作
最近工作的时候遇到一个问题,根据Web端接收到的对象obj1,更新对应的对象值ogj2.先判断obj1中属性值是否为null, 若不等于null,则更新obj2中对应属性值:若等于null,则保持ob ...
- 记录最初工作下的笔记($.each)
没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. each遍历在工作中很常用,平时工作最常用的就是快速找到html上dom节点以达到找寻数据,和ajax接受j ...
- jquery 之for 循环
jquery 的 for 循环: 1. var userList = [11,22,33,44]; $.each(userList,function(i,item){ console.log(i, i ...
- 成 功 的 背 后 !( 致给所有IT人员)
转载了这篇文章,希望能对自己和看到这篇博客的人有所激励. 成功的背后,有着许多不为人知的故事,而正是这些夹杂着泪水和汗水的过去,才成就了一个个走向成功的普通人. ------------------- ...