精华内容
下载资源
问答
  • Agent概述

    万次阅读 2018-08-27 10:54:44
    参考:... 1. Agent定义 Agent的概念——1977年Carl Hewitt “Viewing Control Structures as Patterns of Passing Messages” Agent一词最早见于M.Minsky于1986年出版的《...

    参考:https://www.cnblogs.com/6DAN_HUST/archive/2010/07/21/1782106.html

    1. Agent定义

    Agent的概念——1977年Carl Hewitt “Viewing Control Structures as Patterns of Passing Messages”

    Agent一词最早见于M.Minsky于1986年出版的《Society of Mind》

     

    广义的Agent包括人类、物理世界的机器人和信息世界的软件机器人。

    狭义的Agent专指信息世界中的软件机器人或称软件Agent

     

    Wooldrige 《Intelligent Agents: Theory and Practice》:

    1) 弱定义

    Agent用来最一般地说明一个软硬件系统,具有四个特性:

    (1)自治性。在无人或其他系统的直接干预下可自主操作,并能控制其行为和内部状态。

    (2)社会性。能够通过某种通信语言与其他Agent(也可能是人)进行交互。

    (3)反应性。感知所处的环境,对环境的变化做出实时的反应,并可通过行为改变环境。

    (4)能动性。不仅仅简单地对环境做出反应,而且可以主动地表现出目标驱动的行为。

     

    2) 强定义

    Agent除具备弱定义中所有特性外,还应具备一些人类才具有的特性,如知识、信念、义务、意图等。

     

    2. Agent类型

    (一) 常用划分

    1) 简单反应式Agent

    简单反应式Agent结构框图

    图1 简单反应式Agent结构框图

     

    2) 内置状态反应式Agent

    内置状态反应式Agent结构框图

    图2 内置状态的反应式Agent结构框图

     

    3) 目标驱动的Agent

    目标驱动的Agent结构框图

    图3 目标驱动的Agent结构框图

     

    4) 效用驱动的Agent

    效用驱动的Agent结构框图

    图4 效用驱动的Agent结构框图

     

    (二) 按问题求解能力划分

    反应型Agent :能响应环境的变化或来自其他Agent的消息。
    慎思型Agent(意图型Agent):能够针对意图和信念进行推理,建立行为计划,并执行这些计划。
    社会性Agent:除具有意图Agent的能力外,还具有关于其他主体的明确模型。

     

    3. Agent的环境

    1) 环境的属性

    环境属性

    图5 环境的属性

     

    可知性:Agent传感设备使它可以了解环境的全部状态。对于完全可知的环境,Agent无需保存内置状态信息。

    确定性:下一步环境的状态可以由当前状态和Agent选择的动作来完全决定。

    阶段性:在一个按时间划分为一个个不相关的阶段的环境里,Agent的执行过程也将划分为一个个阶段。

    静态和动态:如果环境在Agent进行推理的时候就发生改变,就说该环境对于Agent来说是动态的,否则就是静态的。

    连续性:如果系统中只有有限的、区别明显的、清晰定义的知觉对象和动作,就说环境是离散的。

     

    2) 环境程序(环境模拟器)

    procedure RUN-ENVIRONMENT(state,UPDATE-FN,Agents,termination)
    inputs:state,the initial state of the environment
    UPDATE-FN,function to modify the environment
    Agents,a set of Agents
    termination,a predicate to test when we are done
    repeat
    for each Agent in Agents do
    PERCEPT[Agent]GET_PERCEPT(Agent, state)
    end
    for each Agent in Agents do
    ACTION[Agent]PROGRAM[Agent](PERCEPT[Agent])
    end
    state UPDATE-FN(actions, Agents, state)
    until termination(state)

     

    参考文献:

    [1] 王汝传, 徐小龙, 黄海平等. 智能Agent及其在信息网络中的应用. 北京: 北京邮电大学出版社

    展开全文
  • Java Agent

    千次阅读 2019-01-15 20:26:53
    在 Java 字节码 一文中有提到,使用 Java Agent 操控字节码,本文将讨论 Java Agent ,这是普通 Java 开发人员的真正的黑魔法。Java Agent 能够通过执行字节码的直接修改,在运行时 “侵入” JVM 上运行的 Java 应用...

    Java 字节码 一文中有提到,使用 Java Agent 操控字节码,本文将讨论 Java Agent ,这是普通 Java 开发人员的真正的黑魔法。Java Agent 能够通过执行字节码的直接修改,在运行时 “侵入” JVM 上运行的 Java 应用程序的执行。Java Agent 很强大,但是也很危险:它们几乎可以完成所有操作,但是如果出现问题,也很容易导致 JVM 崩溃。
    我们将通过解析 Java Agent 如何工作,如何运行它们以及展示 Java Agent 作为明显优势的一些简单示例来揭开 Java Agent 的神秘面纱。

    1. Java Agent 基础知识

    从本质上讲,Java Agent 是一个遵循一组严格约定的常规 Java 类。代理类必须实现一个 public static void premain(String agentArgs, Instrumentation inst) 成为代理入口点的 main 方法(类似于常规 Java 应用程序的方法)。

    Java 虚拟机(JVM)初始化后,premain(String agentArgs, Instrumentation inst) 将按照在 JVM 启动时指定代理的顺序调用每个代理的每个此类方法。完成此初始化步骤后, main 将调用真正的 Java 应用程序方法。简单来讲,就是 premain 方法,在 main 方法之前执行。

    但是,如果类没有实现 public static void premain(String agentArgs, Instrumentation inst) 方法,JVM 将尝试查找并调用另一个重载版本 public static void premain(String agentArgs) 。注意,每个 premain 方法都必须返回,以便启动阶段继续进行。

    咋一看很简单,但 Java Agent 实现应该提供另外一件事作为其包装的一部分:manifest。通常在 META-INF 文件夹中,名为 MANIFEST.MF,包含于包分发相关的各种元数据。
    点击阅读:Java Agent 官方文档

    2. Java Agent 代理和检测

    Java Agent 的检测功能是无限的。最值得注意的包括但不限于:

    • 能够在运行时重新定义类。
      重新定义可以改变方法体,常量池和属性。重定义不得添加,删除,重命名字段或方法,不得更改方法的签名或更改继承。
    • 能够在运行时重新转换类。
      重新转换可以改变方法体,常量和属性。新转换不得添加,删除,重命名字段或方法,不得更改方法的签名或更改继承。
    • 能够允许使用应用于名称的前缀进行重试来修改本机方法解析的失败处理。

    注意,在应用了转换或重新定义之后,不会检查,验证和安装重新转换或重新定义的类字节码。如果生成的字节码错误或不正确,则会抛出异常,这可能会导致 JVM 完全崩溃。

    3. 编写一个简单的 Java Agent

    我们将通过实现自己的类转换器来编写一个简单的 Java Agent。话虽如此,使用 Java Agent 的唯一缺点是,需要直接的字节码操作技能(如果大家对 Java 字节码 不是很了解,可以参考我的这篇文章: Java 字节码 )。而且,遗憾的是,Java 标准库不提供任何 API来使这些字节码操作成为可能。
    为了填补这一空白,Java 社区提供了一些很成熟的库,比如 Javassist (Javassist 入门)。
    现在,我们着手编写一个示例,我们假设想捕获 Java 应用程序中打开的每个 HTTP 连接的 URL。有很多方法可以通过直接修改 Java 源代码来实现,但让我们假设源代码由于许可证策略或其他原因而不可用。
    为了方便操作 Java 字节码,首先引入 Javassist 的 maven 包:

    <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
        <dependency>
          <groupId>org.javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.24.1-GA</version>
        </dependency>
    

    打开 HTTP 连接的类的典型示例如下所示:

    public class SimpleClass {
        public static void main( String[] args ) throws IOException {
            System.out.println("===========执行main方法=============");
            fetch("http://www.baidu.com");
            fetch("http://www.163.com");
        }
    
        private static void fetch(final String address) throws IOException {
    
            final URL url = new URL(address);
            final URLConnection connection = url.openConnection();
    
            try (final BufferedReader in = new BufferedReader(
                    new InputStreamReader( connection.getInputStream())
            )){
                String inputLine = null;
                final StringBuffer sb = new StringBuffer();
                while ( (inputLine = in.readLine()) != null){
                    sb.append(inputLine);
                }
    
                System.out.println("Content size:" + sb.length());
            }
    
        }
    
    }
    

    Java Agent 非常适合解决此类问题。我们只需要定义变换器,它将 sun.net.www.protocol.http.HttpURLConnection 通过注入代码来稍微修改构造函数。让我们来看看其实现:

    public class SimpleClassTransformer implements ClassFileTransformer {
        @Override
        public byte[] transform(
                ClassLoader loader,
                String className,
                Class<?> classBeingRedefined,
                ProtectionDomain protectionDomain,
                byte[] classfileBuffer) throws IllegalClassFormatException {
            if(className.endsWith("sun/net/www/protocol/http/HttpURLConnection")){
                ClassPool classPool = ClassPool.getDefault();
                CtClass clazz = null;
                try {
                    clazz = classPool.get("sun.net.www.protocol.http.HttpURLConnection");
    
                    CtConstructor[] cs = clazz.getConstructors();
                    for(CtConstructor constructor: cs){
                        constructor.insertAfter("System.out.println(this.getURL());");
                    }
    
                    byte[] byteCode = clazz.toBytecode();
                    clazz.detach();
    
                    return byteCode;
                } catch (NotFoundException | CannotCompileException | IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }
    

    定义 premain 方法,将 SimpleClassTransformer 类的实例添加到检测上下文中:

    public class SimpleAgent {
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("=========开始执行premain============");
            SimpleClassTransformer transformer = new SimpleClassTransformer();
            inst.addTransformer(transformer);
    
        }
    }
    

    要完成 Java Agent,还需要提供正确的 MANIFEST.MF,以便 JVM 能够选择正确的类。在 META-INF 目录下找到你的 MANIFEST.MF 文件:

    Manifest-Version: 1.0
    Premain-Class: com.demo.SimpleAgent
    
    

    请注意,冒号后面一定要有空格,最后一行要为空。

    4. 运行 Java Agent

    从命令运行时,可以使用 -javaagent

    -javaagent:<path-to-jar>[=options]
    
    

    类似如下:

    java -javaagent:agent.jar
    

    注意,这是条伪命令,因为 agent.jar 有引用 javassist.jar 包中的内容,想要执行成功还需要调用 javassist.jar,命令如下:

    java -javaagent:agent.jar -jar javassist.jar
    

    运行结果:
    在这里插入图片描述
    下面我们在 IDE 中运行 Java Agent。

    使用 idea:

    在这里插入图片描述
    然后运行 SimpleClass 中的 main 方法。结果如下:
    在这里插入图片描述

    使用 Eclipse:

    在这里插入图片描述
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    写到这里,突然想到以前公司花了150W买过一个链路监控的产品,就是基于Java Agent 做的,功能很强大。但是需要注意,任何错误或不准确的字节码生成都可能导致JVM崩溃,一把双刃剑,看你怎么用了。

    展开全文
  • idea agent

    2020-05-27 09:47:12
  • Java Agent 调试,Java agent debug

    千次阅读 2020-02-02 16:24:11
    Java Agent 调试,agent debug 一、简介 Java agent 是在另外一个 Java 应用(“目标”应用)启动之前要执行的 Java 程序,这样 agent 就有机会修改目标应用或者应用所运行的环境。修改环境的时候做到对于项目中的...

    Java Agent 调试,agent debug

    一、简介

    Java agent 是在另外一个 Java 应用(“目标”应用)启动之前要执行的 Java 程序,这样 agent 就有机会修改目标应用或者应用所运行的环境。修改环境的时候做到对于项目中的代码没有入侵性,不需要修改老项目代码即可实现想要的能力,比如常见的skywoking,就是通过这样的方式实现的。比如这篇文章 通过修改字节码实现Java Agent 通过使用 Byte Buddy,便捷地创建 Java Agent 。还有一些功能,比如热更新、arthas 替换class字节码等等。

    问题

    • Java agent的实现原理是什么?
    • Java agent 如何调试呢?习惯了现在的直接代码调试?对于agent 有点慌。

    二、原理

    Java agent 主要是通过Instrumentation实现的。

    Instrumentation

    简介

    java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。
        在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument、本地代码(native code)instrument,以及动态改变 classpath 等等。这些改变,意味着 Java 具有了更强的动态控制、解释能力,它使得 Java 语言变得更加灵活多变。
        “java.lang.instrument”包的具体实现,依赖于 JVMTI。JVMTI(Java Virtual Machine Tool Interface)是一套由 Java 虚拟机提供的,为 JVM 相关的工具提供的本地编程接口集合。JVMTI 是从 Java SE 5 开始引入,整合和取代了以前使用的 Java Virtual Machine Profiler Interface (JVMPI) 和 the Java Virtual Machine Debug Interface (JVMDI),而在 Java SE 6 中,JVMPI 和 JVMDI 已经消失了。JVMTI 提供了一套”代理”程序机制,可以支持第三方工具程序以代理的方式连接和访问 JVM,并利用 JVMTI 提供的丰富的编程接口,完成很多跟 JVM 相关的功能。当我们谈Debug时,我们在谈什么(Debug实现原理) 这个让我想到了这篇文章,其实感觉和debug的道理一样的,debug的时候可以修改参数,或者数据的信息。

    官方文档

    This class provides services needed to instrument Java programming language code. Instrumentation is the addition of byte-codes to methods for the purpose of gathering data to be utilized by tools. Since the changes are purely additive, these tools do not modify application state or behavior. Examples of such benign tools include monitoring agents, profilers, coverage analyzers, and event loggers.(这个类提供了测试 Java 编程语言代码所需的服务。仪器是将字节代码添加到方法中,目的是收集工具使用的数据。由于这些更改纯粹是附加的,因此这些工具不会修改应用程序状态或行为。此类良性工具的示例包括监控代理、分析器、覆盖分析器和事件记录器。) 
    有两种方法可以获取仪器接口的实例:

    • When a JVM is launched in a way that indicates an agent class. In that case an Instrumentation instance is passed to the premain method of the agent class.(当 JVM 以指示代理类的方式启动时。在这种情况下,检测实例被传递给代理类的 premain 方法。)
    • When a JVM provides a mechanism to start agents sometime after the JVM is launched. In that case an Instrumentation instance is passed to the agentmain method of the agent code.(当 JVM 在 JVM 启动后的某个时候提供启动代理的机制时,检测实例被传递给代理类的 agentmain 方法)

    Java Instrumentation-csdn  https://blog.csdn.net/DorMOUSENone/article/details/81781131

    三、Java agent debug 实践

    Agent 包结构

    agent 打包的信息

    META-INF.MANIFEST.MF,需要保护一些信息,就是入口类需要传递一个Instrumentation变量给你,JVM 启动的入口类的信息 Premain-Class: com.wangji92.agent.JvmAgentAop,这样标识这个是一个agent。

    Manifest-Version: 1.0
    Implementation-Title: jvm-agent-aop
    Premain-Class: com.wangji92.agent.JvmAgentAop
    Implementation-Version: 1.0-SNAPSHOT
    Built-By: wangji
    Agent-Class: com.wangji92.agent.JvmAgentAop
    Can-Redefine-Classes: true
    Specification-Title: jvm-agent-aop
    Can-Retransform-Classes: true
    Created-By: Apache Maven 3.6.1
    Build-Jdk: 1.8.0_181
    Specification-Version: 1.0-SNAPSHOT
    

    agent 入口类小例子

    package com.wangji92.agent;
    
    import java.lang.instrument.Instrumentation;
    
    /**
     * @author 汪小哥
     * @date 31-01-2020
     */
    public class BeforeJvmJavaAgent {
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("this is an agent.");
            System.out.println("this is an agent 和jvm 一起启动");
            System.out.println("args:" + agentArgs + "\n");
    
            Class[] allLoadedClasses = inst.getAllLoadedClasses();
            for (Class loadedClass : allLoadedClasses) {
                System.out.println("load class:" + loadedClass.getCanonicalName());
                if (loadedClass.getClassLoader() != null) {
                    System.out.println("  classloader"+loadedClass.getClassLoader().toString() + "\n");
                }else{
                    System.out.println("\n");
                }
            }
    
        }
    }
    
    

    maven 配置,参考arthas

     <build>
            <finalName>simple-before-jvm-agent</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <showDeprecation>true</showDeprecation>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>single</goal>
                            </goals>
                            <phase>package</phase>
                            <configuration>
                                <descriptorRefs>
                                    <descriptorRef>jar-with-dependencies</descriptorRef>
                                </descriptorRefs>
                                <archive>
                                    <manifestEntries>
                                        <Premain-Class>com.wangji92.agent.BeforeJvmJavaAgent</Premain-Class>
                                        <Agent-Class>com.wangji92.agent.BeforeJvmJavaAgent</Agent-Class>
                                        <Can-Redefine-Classes>true</Can-Redefine-Classes>
                                        <Can-Retransform-Classes>true</Can-Retransform-Classes>
                                        <Specification-Title>${project.name}</Specification-Title>
                                        <Specification-Version>${project.version}</Specification-Version>
                                        <Implementation-Title>${project.name}</Implementation-Title>
                                        <Implementation-Version>${project.version}</Implementation-Version>
                                    </manifestEntries>
                                </archive>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    Java agent 加载的两种方式

    根据Java agent的挂载方式有两种,一种是直接在启动的时候挂载,一种是启动完成之后进行挂载(arthas 就是通过这种方式实现的)。这里实践的时候采用第一种。

    JVM 一起启动

    直接在启动参数中增加即可

    # 通过java 可以查看到帮助文档 
    -javaagent:<jarpath>[=<选项>]
     加载 Java 编程语言代理, 请参阅 java.lang.instrument
    

    比如这个

    • simple-before-jvm-agent-jar-with-dependencies.jar  agent 包
    • target-java.jar 目标spring boot 程序
    #!/bin/sh -x
    dir=$(cd `dirname $0`;pwd)
    echo $dir
    mvn clean package && \
    java -javaagent:$dir/simple-before-jvm-agent/target/simple-before-jvm-agent-jar-with-dependencies.jar=text-args \
    -jar $dir/target-java/target/target-java.jar
    

    JVM 启动之后 挂载(参考arthas)

    将arthas-agent attach 到目标java进程。
    主要代码:com.taobao.arthas.core.Arthas#attachAgent,直到这里,原始的arthas-core的进程处理已经结束了,同事触发了arthas-agent.jar 作为目标java类的代码类触发了arthas-agent Agent-Class(具体可以参考maven xml 配置) agentmain 方法

    ## 1、attach 到目标进程
    virtualMachine = VirtualMachine.attach("" + configure.getJavaPid());
    
    ## 2、在jvm启动后天就agent,第一个是agent的jar位置,第二个传递的参数
    ## 了解更多可以参考 java.lang.instrument.Instrumentation
    virtualMachine.loadAgent(arthasAgentPath,
                        configure.getArthasCore() + ";" + configure.toString());
    

    理解debug

    当我们谈Debug时,我们在谈什么(Debug实现原理) 这篇文章被我引用了很多次,其实debug就是JPDA之上进行处理,Java agent 也是通过 Instrumentation 依赖JVMTI 实现对于JVM中的字节码修改,获取JVM 虚拟机的加载的字节码的信息,两者之间太像了,当我们想讨论如何debug java agnet的代码的时候,是否想过agent 和目标的代码有什么异同?对对,都是在同一个JVM中的。无论是我们使用远程debug 还是IDEA上的debug其实实质上都是建立在JPDA的基础上,JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构的缩写。由3个规范组成,分别是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface) 。因此都是在一个JVM 里面的,只要目标class 启动的时候开启了debug,那么agent 也可以被debug的。可能在直接使用IDEA debug的时候有一些限制,比如必须在同级的module下面才能debug,那么远程debug就是天然的可以啦!

    实战Agent debug(AOP 统计耗时)

    agent 入口类

    package com.wangji92.agent;
    
    import net.bytebuddy.agent.builder.AgentBuilder;
    import net.bytebuddy.description.type.TypeDescription;
    import net.bytebuddy.dynamic.DynamicType;
    import net.bytebuddy.implementation.MethodDelegation;
    import net.bytebuddy.matcher.ElementMatchers;
    import net.bytebuddy.utility.JavaModule;
    
    import java.lang.instrument.Instrumentation;
    
    import static net.bytebuddy.matcher.ElementMatchers.*;
    
    /**
     * https://segmentfault.com/a/1190000007253689
     * https://www.infoq.cn/article/Easily-Create-Java-Agents-with-ByteBuddy/
     * https://blog.csdn.net/undergrowth/article/details/86493336
     * https://www.jianshu.com/p/7a5a2c78dab4
     * https://blog.csdn.net/DorMOUSENone/article/details/81781131
     * jvmAop 处理
     *
     * @author 汪小哥
     * @date 01-02-2020
     */
    public class JvmAgentAop {
    
        public static void premain(String agentArgs, Instrumentation inst) {
            System.out.println("this is an agent.");
            System.out.println("this is an agent 和jvm 一起启动");
            System.out.println("args:" + agentArgs + "\n");
            new AgentBuilder.Default()
                    .type(nameStartsWith("com.wangji92.target").and(not(isInterface())).and(not(isStatic())))
                    .transform(new AgentBuilder.Transformer() {
                        @Override
                        public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
                            return builder.method(ElementMatchers.any())
                                    .intercept(MethodDelegation.to(CostTimeInterceptor.class));
                        }
                    }).installOn(inst);
    
        }
    }
    
    

    byte-buddy AOP 处理

    byte-buddy 修改字节码可以参考这个 https://blog.csdn.net/undergrowth/article/details/86493336
    这里只是简单的统计耗死问题。

    package com.wangji92.agent;
    
    import net.bytebuddy.implementation.bind.annotation.Origin;
    import net.bytebuddy.implementation.bind.annotation.RuntimeType;
    import net.bytebuddy.implementation.bind.annotation.SuperCall;
    
    import java.lang.reflect.Method;
    import java.util.concurrent.Callable;
    
    /**
     * aop 耗时计算
     *
     * @author 汪小哥
     * @date 01-02-2020
     */
    public class CostTimeInterceptor {
    
        @RuntimeType
        public static Object intercept(@Origin Method method,
                                       @SuperCall Callable<?> callable) throws Exception {
            System.out.println("call " + method.getName());
            long start = System.currentTimeMillis();
            try {
                return callable.call();
            } finally {
                System.out.println(method + " took " + (System.currentTimeMillis() - start));
            }
        }
    }
    
    

    目标类

    /**
     * @author 汪小哥
     * @date 30-01-2020
     */
    @RestController
    @RequestMapping("/")
    public class JavaAgentTargetController {
    
        @RequestMapping("/test/{name}")
        @ResponseBody
        public String getClassName(@PathVariable String name) {
            String result = this.getClass().getSimpleName().concat(name);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
               //
            }
            return result;
        }
    }
    

    启动脚本

    这里通过脚本启动,并开启远程debug,然后在IDEA 中添加一个remote debug 填写端口5005,随便访问一个目录类,即可实现debug agent的目的

    #!/bin/sh -x
    dir=$(cd `dirname $0`;pwd)
    echo $dir
    mvn clean package && \
    java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n \
    -javaagent:$dir/jvm-agent-aop/target/jvm-agent-aop-jar-with-dependencies.jar=text-args \
    -jar $dir/target-java/target/target-java.jar
    
    # 本文主要是为了测试 agent的debug 功能,从而了解arthas debug
    # 实际上,agent的 remote debug 只要agent和target 在同一个jvm 中就会被加载,从而可以debug。
    
    
    ## 通过Byte Buddy 实现字节码修改(skyworking 也是这样的) 参考 https://zhuanlan.zhihu.com/p/84514959
    ## 使用bytebuddy构建agent   https://segmentfault.com/a/1190000007253689
    ## 通过使用 Byte Buddy,便捷地创建 Java Agent  https://www.infoq.cn/article/Easily-Create-Java-Agents-with-ByteBuddy/
    ## byte-buddy 1.9.6 简述及原理1  https://blog.csdn.net/undergrowth/article/details/86493336 github 有demo
    ## java agent: JVM的层面的"AOP"  https://www.jianshu.com/p/7a5a2c78dab4
    
    

    四、总结

    不断的学习、总结,才能理解更加的深刻。
    代码地址:https://github.com/WangJi92/java-agent

    更多汪小哥

    展开全文
  • Agent系统

    千次阅读 2018-08-27 11:10:53
    Agent是分布式人工智能和现代计算机、通信技术发展的必然结果。给Agent下一个确切的定义很困难,一般都是根据自己的研究领域和需求进行定义。最经典和广为授受的是Wooldridge等人的“弱定义”和“强定义”[104]。1)...
  • APM Agent 之 动态注入 agent

    千次阅读 2017-02-21 14:29:50
    APM agent在sprint 17加入了“动态注入”的新特性。使得agent可以在监控的目标应用不需要重启和额外配置的情况下,就能够注入到目标应用。agent动态注入特性支持JDK6及以上版本。一、动态注入agent的命令: 假设APM ...
  • javaagent

    千次阅读 2017-12-13 16:36:28
    Javaagent概述javaagent是一个简单优雅的java agent,利用java自带的instrument特性+javassist字节码编辑技术,实现了无侵入的方法级性能监控。相比于NewRelic或者开源的pinpoint,本工具主打的是简单,我们只记录每个...
  • ssh-agent 详解

    万次阅读 2019-06-15 18:54:05
    此博客的配图来自《SSH The Secure Shell 2nd》,内容也是对该书相关章节的总结与一些...可以通过 ssh-agent 来管理私钥,把私钥加载进内存,之后便不用再输入私钥。 ssh-agent 代理 ssh-agent 的原理如下图: ...
  • QEMU Guest Agent

    千次阅读 2020-06-16 23:17:01
    目录 文章目录目录QEMU Guest ...QEMU Guest Agent,简称 QGA,是运行在 QEMU 虚拟机内部的一个守护程序 qemu-guest-agent.service,类似于 VMware tools,主要用于辅助 Hypervisor 实现对 Guest 的管理。 官方网站: ...
  • Agent理解

    2016-12-19 11:47:00
    简单来说,Agent是一个交互性的技术。 比如我们在网上购物时,主体是人,即请求的发出者,我们在搜索商品时,向系统发出请求,系统会给我们一个返回结果,然而我们发现很多情况下,我们会在商品栏目中发现我们之前...
  • 常见User-Agent大全

    万次阅读 多人点赞 2019-04-27 12:52:56
    User-Agent:的值 1) Chrome(谷歌) Win7: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1 Win10: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Apple...
  • agent配置

    千次阅读 2014-07-16 15:31:50
    agent2.sources=s1 agent2.channels=c1 agent2.sinks=k1 agent2.sources.s1.type = spooldir agent2.sources.s1.spoolDir =/var/log/hutxlog agent2.sources.s1.fileHeader =true agent2.sources.s1.fileHeade
  • wazuh agent 认证

    2019-10-31 14:56:08
    wazuh 是一款hids, c/s架构, agent 要连上manager,需要进行认证。 认证的方式有多种,下面提供一种比较简单的方式来处理: 在agent端使用agent-auth来进行认证获取agent key 查看帮助信息 /var/ossec/bin/...
  • Javaagent使用

    万次阅读 2018-05-11 14:05:12
    javaagent 简介 Javaagent 只要作用在class被加载之前对其加载,插入我们需要添加的字节码。 javaagent主要作用 可以在加载java文件之前做拦截把字节码做修改 可以在运行期将已经加载的类的字节码做变更,但是...
  • 常用User-Agent大全

    万次阅读 2020-06-02 09:25:02
    原文 之前学习北京理工嵩天老师的《Python网络爬虫与信息提取》时,爬取亚马逊的一款图书的详细信息时出现以下错误: ![Upload 亚马逊爬虫.PNG failed.... 查看请求信息,发现我们一般写的...User-Agent会告诉网站..
  • 智能Agent笔记

    千次阅读 2015-08-16 20:31:49
    理性Agent:追求尽可能好的行为表现。Agent表现如何取决于环境的本质。Agent通过传感器感知环境并通过执行器对所处环境产生影响。Agent的感知序列是该Agent所收到的所有输入数据的完整历史。一般地,Agent在任何给定...
  • AdventNet Agent Toolkit C Edition6 AGENT

    千次阅读 2016-04-29 11:50:57
    开发工具:AdventNet Agent Toolkit C Edition6 参考文档:C:\AdventNet\C-Agent文档下的readme.和网页agent收藏夹下的WebNMS AgentToolkit C Edition 6 - Release 6.4.0 ...
  • Agent是什么

    2019-04-24 14:00:00
    广义的Agent包括人类、物理世界的机器人和信息世界的软件机器人。 狭义的Agent专指信息世界中的软件机器人或称软件Agent。 1) 弱定义 Agent用来最一般地说明一个软硬件系统,具有四个特性: (1)自治性...
  • Java Agent介绍

    千次阅读 2018-09-24 14:18:30
    Java Agent注入的使用方法 在进程B中向进程A中注入java agent,需要满足以下条件: java agent中的所有依赖,在进程A中的classpath中都要能找到,否则在注入时进程A会报错NoClassDefFoundError java agent的pom...
  • IDEA java agent调试

    千次阅读 2020-04-07 14:27:41
    java agent调试方法: 首先把agent打成jar包 在VM options里填写:-javaagent: /agent路径/agent.jar 如果有多个参数要填,空格隔开就行了 然后debug模式就可以同时调试主程序和agent了 ...
  • SSH agentagent forwarding

    千次阅读 2013-01-24 20:22:46
    把ssh-agent单拿出来说,是因为随着公司的跳板机方案的实施,ssh-agent将大规模被或暗地里被应用。理解它的原理有助于我知道相关的部署和操作,以及如何安全滴应用。 像其他linux软件一样,最好的资料是用英文写...
  • CM=Cloudera Manager Agent 即 cm 代理进程它是和cm server进程通信的一个对端进程,目的是让安装了cm agent进程的那台 hadoop环境主机或者是impalad主机 定期上报自己的相关hadoop组件进程或impalad进程的工作状态...
  • RVO避开agent

    千次阅读 2018-07-25 22:24:39
    A* Pathfinding Project 3.1.4 RVO的使用 ...其实自己之前也写过避开agent的算法,但使用了大量的射线,其实在agent数量比较少的情况下效果还不错,但面临大量agent时,射线这个方法就不适用了。这也促使我去...
  • Zabbix-agent部署

    2019-04-04 18:00:45
    Zabbix-agent部署 zabbix agent 部署 AIX部署zabbix agent HP UX部署 zabbix agent
  • HTTP Agent理解

    2019-08-03 15:36:12
    一个 Agent是在client端用来管理链接的持久性和重用。对于一个host+port维持着一个请求队列,这些请求重复使用一个socket,直到这个队列空,这时,这个socket会被destroy或者放到pool里,在pool里时这个socket将会被...
  • ServerAgent下载

    千次阅读 2020-03-25 11:48:21
    一、下载 首先进入网址...ServerAgent-2.2.1.zip JMeterPlugins-Standard-1.3.1.zip JMeterPlugins-Extras-1.3.1.zip 其中JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的,S...
  • Java Agent实战

    千次阅读 2019-09-01 14:40:30
    简单来说,Java Agent就是JVM为了应用程序提供的具有检测功能的软件组件。在Java Agent的上下文中,通过JDK1.5出现的java.lang.instrument.Instrumentation来提供重新定义在运行时加载的类的内容的能力。那么这有...
  • SkyWalking Agent 基于 JavaAgent 机制,实现应用透明接入 SkyWalking 。关于 JavaAgent 机制,笔者推荐如下两篇文章 : 《Instrumentation 新功能》 :https://www.ibm.com/developerworks/cn/java...
  • zabbix agent 的两种安装方式

    万次阅读 2018-08-29 09:35:17
    (一)zabbix-agent介绍和工作原理 1 介绍  zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。  zabbix能监视各种网络参数,保证服务器系统的安全运营;并...
  • user agent stylesheet如何修改

    万次阅读 2018-07-11 11:43:32
    有天按导师吩咐写了个网页,发现h2标签的样式不太对劲,遂按下F12调试,在右侧style面板中发现了我从未定义过的样式,来自user agent stylesheet,查阅了资料以后发现这货是浏览器自动加上的格式。 具体来说是这样...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,268
精华内容 46,507
关键字:

agent