java_opts jaragent,VMOptions之javaagent

After the Java Virtual Machine (JVM) has initialized, each premain method will be called in the order the agents were specified, then the real application main method will be called.

简单来说,JVM在Main-Class的main方法被调用之前,会先调用java agent的premain方法。

java agent以jar包的形式存在,jar包的MANIFEST.MF中需要指定一个Premain-Class,与Main-Class类似的,Premain-Class也有约定的方法,public static void premain(String agentArgs, Instrumentation inst);,如果没找到,则尝试public static void premain(String agentArgs);。下面我们就写一个获取VM options的java agent。

简单起见,在我们jar包里面Premain-Class跟Main-Class都有,

import java.lang.instrument.Instrumentation;

import java.lang.management.ManagementFactory;

import java.lang.management.RuntimeMXBean;

import java.util.List;

public class Agent {

public static void premain(String agentArgs, Instrumentation inst) {

System.out.println("hello Agent");

RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();

List arguments = runtimeMxBean.getInputArguments();

System.out.println(arguments);

}

}

public class Main {

public static void main(String[] args) {

System.out.printf("hello Main");

}

}

新建一个MANIFEST,有两个坑爹的地方要注意,

首先,Warning: The text file must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return. 所以MANIFEST最后要空一行出来;

然后是,Main-Class中类路径用/分割,Premain-Class则还是用.,坑。

Main-Class: me/kisimple/javaagent/Main

Premain-Class: me.kisimple.javaagent.Agent

打jar包,

E:\Projects\java\javaagent\out\production>jar cvfm iagent.jar imanifest -C javaa

gent/ .

已添加清单

正在添加: me/(输入 = 0) (输出 = 0)(存储了 0%)

正在添加: me/kisimple/(输入 = 0) (输出 = 0)(存储了 0%)

正在添加: me/kisimple/javaagent/(输入 = 0) (输出 = 0)(存储了 0%)

正在添加: me/kisimple/javaagent/Agent.class(输入 = 811) (输出 = 449)(压缩了 44%)

正在添加: me/kisimple/javaagent/Main.class(输入 = 601) (输出 = 356)(压缩了 40%)

运行的时候也有两个坑爹的地方,

-javaagent必须放在-jar之前,否则java agent无法执行;

在-javaagent之后的options,java agent无法获得。

E:\Projects\java\javaagent\out\production>java -Dsystemp=systemv -XX:+UseG1GC -j

avaagent:iagent.jar -jar iagent.jar -XX:+UseCompressedOops

hello Agent

[-Dsystemp=systemv, -XX:+UseG1GC, -javaagent:iagent.jar]

hello Main

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值