内容简述

 

-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...

想要了解动态捆绑机制,可以参考:

http://ifeve.com/jvm-attach/

JavaSe:-javaagent,-agentlib,-agentpath的更多相关文章

  1. JVM插码之三:javaagent介绍及javassist介绍

    本文介绍一下,当下比较基础但是使用场景却很多的一种技术,稍微偏底层点,就是字节码插庄技术了...,如果之前大家熟悉了asm,cglib以及javassit等技术,那么下面说的就很简单了...,因为下面 ...

  2. JavaSe:Properties文件格式

    Properties文件格式说明 Properties继承自Hashtable,是由一组key-value的集合. 在Java中,常用properties文件作为配置文件.它的格式是什么样的呢? 下图 ...

  3. JavaSe:ThreadLocal

    JDK中有一个ThreadLocal类,使用很方便,但是却很容易出现问题.究其原因, 就是对ThreadLocal理解不到位.最近项目中,出现了内存泄漏的问题.其中就有同事在使用ThreadLocal ...

  4. JavaSe:Cookie 管理的API介绍

    CookieManager 在使用HttpURLConnection中,并没有关于Cookie的管理.如果使用Java程序时,怎么管理cookie呢? Cookie案例 1. User Agent - ...

  5. JavaSe:Comparator

    今天,公司里有一个萌萌的妹子问我java 中的comparator是怎么回事.参数分别是什么,返回值又是什么,为此,我写了一个简单的程序告诉了她: public static void main (S ...

  6. JavaSe:代码块执行顺序

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. //普通代码块:在方法或语句中出现 ...

  7. JavaSe:UncaughtExceptionHandler

    Java中,出现对于异常的处理,通常是使用try{}catch()来捕获处理的.但是在使用trycatch时,未必会将所有的异常都捕获到,所以方法声明时可以有throws xxxException. ...

  8. JavaSE:关键字(全)

    访问控制: private 访问控制方式:私有的 protected 访问控制方式:受保护的 public 访问控制方式:公共的 类.方法和变量修饰符: abstract 声明抽象,表明类或者成员方法 ...

  9. JavaSE:数据类型之间的转换(附常见面试题)

    数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...

随机推荐

  1. 为什么WebSphere好好的,他就不干活了?

    “修理不好用的WebSphere,有时候要看运气.”这个是我接触过很过有历史的运维工程师经常说的一个梗;研发人员也经常说这个程序在我这里运行好好的,怎么到你那就不灵了?问题是你的,你自己解决. 声明一 ...

  2. 对来自于Azure的远程连接文件(.rdp)的另一种更便捷的自定义方法

    在上一篇日志中(很抱歉那张比较黑的截图)介绍了如何获得Azure中的Windows虚拟机的远程连接文件,以及一种基于文本编辑方式进行自定义的方法. 实际上对于在Windows下的用户来说,我们可以使用 ...

  3. machine learning基础与实践系列

    由于研究工作的需要,最近在看机器学习的一些基本的算法.选用的书是周志华的西瓜书--(<机器学习>周志华著)和<机器学习实战>,视频的话在看Coursera上Andrew Ng的 ...

  4. ZOJ Problem Set - 1338 Up and Down Sequences 解释 ac代码

    这道题目我一开始一头雾水,怎么都数不对,参考了下网上的博文,才弄懂. 题意是这样的,如果是上升序列,上升序列的长度不是所有上升数字的,是这么规定的,如果它与前一个数字构成上升,那么这个数字算上长度.所 ...

  5. Android之仿ele地图定位效果

    PS:最近项目要求,希望在选择地址的时候能够仿ele来实现定位效果.因此就去做了一下.不过ele使用高德地图实现的,我是用百度地图实现的.没办法,公司说用百度那就用百度的吧.个人觉得高德应该更加的精准 ...

  6. 常用查找数据结构及算法(Python实现)

    目录 一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 ...

  7. VS2013常用快捷键

    Visual Studio 2013 是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码管控工具.集成开发环境(IDE)等等.VS 2013 中新增了很多提高 ...

  8. Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案

    去年4月,我们为 Rafy 框架添加了领域模型设计器组件.时隔一年,谨以本文,简要说明该领域模型设计器的设计思想. 设计目标 Rafy 实体框架中以领域驱动设计作为指导思想.所以在开发时,以领域建模为 ...

  9. Effective java笔记(九),并发

    66.同步访问共享的可变数据 JVM对不大于32位的基本类型的操作都是原子操作,所以读取一个非long或double类型的变量,可以保证返回的值是某个线程保存在该变量中的,但它并不能保证一个线程写入的 ...

  10. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...