-javaagent:_从javaagent迁移到JVMTI:我们的经验

-javaagent:

当您需要从JVM内收集数据时,您会发现自己很危险地接近Java虚拟机内部进行工作。 幸运的是,有一些方法可以避免被JVM实现细节所困扰。 Java之父不仅给您提供了两个漂亮的工具供您使用。

在这篇文章中,我们将解释两种方法之间的差异,并解释为什么我们最近移植了算法的重要部分。

Java代理

第一种选择是使用java.lang.instrument接口。 这种方法使用-javaagent启动参数将监视代码加载到JVM本身。 作为Java的全部选择,如果您的背景是Java开发,那么javaagents往往是首选的方法。 说明您如何从该方法中受益的最佳方法是通过示例。

让我们创建一个真正简单的代理,该代理将负责监视代码中的所有方法调用。 当代理面对方法调用时,它将把调用记录到标准输出流中:

import org.objectweb.asm.*;public class MethodVisitorNotifyOnMethodEntry extends MethodVisitor {public MethodVisitorNotifyOnMethodEntry(MethodVisitor mv) {super(Opcodes.ASM4, mv);mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(MethodVisitorNotifyOnMethodEntry.class), "callback", "()V");}public static void callback() {System.out.println("Method called!");    }
}

您可以使用上面的示例,将其打包为javaagent(本质上是带有特殊MANIFEST.MF的小JAR文件),然后使用类似于以下内容的代理的premain()方法启动它:

java -javaagent:path-to/your-agent.jar com.yourcompany.YourClass

启动后,您会看到一堆“方法调用!” 日志文件中的消息。 就我们而言,仅此而已。 但是这个概念很强大,尤其是与上面的示例中的字节码检测工具(例如ASM或cgLib)结合使用时。

为了使示例易于理解,我们跳过了一些细节。 但这是相对简单的-使用java.lang.instrument包时,您首先编写自己的代理类,并实现public static void premain(String agentArgs,Instrumentation inst) 。 然后,您需要向inst.addTransformer注册您的ClassTransformer 。 由于您很可能希望避免对类字节码的直接操作,因此可以使用一些字节码操作库,例如我们使用的示例中的ASM。 有了它,您只需要实现几个接口– ClassVisitor (为简便起见,略过)和MethodVisitor。

JVMTI

第二种方法最终将带您进入JVMTI。 JVM工具接口( JVM TI )是标准的本机API,允许本机库捕获事件并控制Java虚拟机。 对JVMTI的访问通常打包在称为代理的特定库中。

下面的示例演示了与javaagent部分相同的回调注册,但是这次将其实现为JVMTI调用:

void JNICALL notifyOnMethodEntry(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jmethodID method) {fputs("method was called!\n", stdout);
}int prepareNotifyOnMethodEntry(jvmtiEnv *jvmti) {jvmtiError error;jvmtiCapabilities requestedCapabilities, potentialCapabilities;memset(&requestedCapabilities, 0, sizeof(requestedCapabilities));if((error = (*jvmti)->GetPotentialCapabilities(jvmti, &potentialCapabilities)) != JVMTI_ERROR_NONE) return 0;if(potentialCapabilities.can_generate_method_entry_events) {requestedCapabilities.can_generate_method_entry_events = 1;}else {//not possible on this JVMreturn 0;}if((error = (*jvmti)->AddCapabilities(jvmti, &requestedCapabilities)) != JVMTI_ERROR_NONE) return 0;jvmtiEventCallbacks callbacks;memset(&callbacks, 0, sizeof(callbacks));callbacks.MethodEntry = notifyOnMethodEntry;if((error = (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks))) != JVMTI_ERROR_NONE) return 0;if((error = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE,    JVMTI_EVENT_METHOD_ENTRY, (jthread)NULL)) != JVMTI_ERROR_NONE) return 0;return 1;
}

两种方法之间存在一些差异。 例如,通过JVMTI,您可以获得比代理更多的信息。 但是,两者之间最关键的区别在于加载机制。 在将Instrumentation代理加载到堆内部时,它们由相同的JVM管理。 JVMTI代理不受JVM规则支配,因此不受JVM内部组件(如GC或运行时错误处理)的影响。 这意味着什么,最好通过我们自己的经验来解释。

从-javaagent迁移到JVMTI

三年前,当我们开始构建内存泄漏检测器时,我们并没有过多地关注这些方法的优缺点。 我们毫不犹豫地将解决方案实现为-javaagent

多年来,我们已经开始理解含义。 其中一些不太令人满意,因此在我们的最新版本中,我们将内存泄漏检测机制的重要部分移植到了本机代码。 是什么使我们跳到这样的结论?

首先-当驻留在堆中时,您需要将自己容纳在应用程序自己的内存结构旁边。 通过痛苦的经验中学到的东西本身就可能导致问题。 当您的应用程序已将堆填满到最大程度时,您最后需要做的是一个内存泄漏检测器,它似乎只会加快OutOfMemoryError的到达速度。

但是增加的堆空间减少了困扰我们的弊端。 真正的问题与以下事实有关:我们的数据结构是使用与受监视的应用程序本身正在使用的相同的垃圾收集器清理的。 这导致更长或更频繁的GC暂停。

尽管大多数应用程序不介意我们增加堆消耗的几个额外百分点,但我们了解到,需要消除对Full GC暂停产生的不可预测的影响。
孤立的衔尾蛇(龙吃自己的尾巴)纹身

更糟的是, Plumbr的工作方式是监视所有对象的创建和集合。 监视某物时,您需要保持跟踪。 跟踪往往会创建对象。 创建的对象将有资格使用GC。 现在,当您监视的是GC时,您刚刚创建了一个恶性循环-收集到更多的对象的垃圾,创建的监视器越多,触发的GC运行频率越高,等等。

跟踪对象时,JVMTI会通知我们有关对象死亡的信息。 但是,JVMTI不允许在这些回调期间使用JNI。 因此,如果我们使用Java保留有关跟踪对象的统计信息,则当我们收到更改通知时,不可能立即更新统计信息。 相反,当我们知道JVM处于正确状态时,需要将更改缓存并应用。 这造成了不必要的复杂性和更新实际统计数据的延迟。

翻译自: https://www.javacodegeeks.com/2014/03/migrating-from-javaagent-to-jvmti-our-experience.html

-javaagent:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/342002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频光端机使用、保养与维护方法详解

现如今,在安防监控工程项目中,视频通信已得到了广泛的应用,在这其中视频光端机可以说是发挥着很重要的作用,视频光端机正越来越广泛的应用到安防工程项目中。那么,我们在工程项目中该如何使用、保养与维护视频光端机呢…

关于视频光端机调制方式及介质特点的介绍

光端机的工作原理就是把信号调制到光上,再然后通过光纤来进行视频数据传输,那么,视频光端机在传输的过程当中有哪些调制方式呢?光纤传输的介质有哪些特点呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xf…

[渝粤教育] 四川师范大学 复变函数与积分变换 参考 资料

教育 -复变函数与积分变换-章节资料考试资料-四川师范大学【】 第一章单元作业题 第一章单元测验题 1、【单选题】 A、 B、 C、 D、 参考资料【 】 2、【单选题】 A、 B、 C、 D、 参考资料【 】 3、【单选题】 A、 B、 C、 D、 参考资料【 】 4、【单选题】 A、 B、 C、 D…

视频光端机园区出入口监控项目应用方案详解

现如今,随着时代的发展,以及用户对安全防范要求的日益提高,监控视频光端机在安防领域得到越来越广泛的运用,而且监控光端机的技术也越来越成熟,所以视频监控在安防监控领域可以说发挥着很重要的作用。接下来我们就来详…

activemq 内存_ActiveMQ中的温度,存储和内存使用百分比

activemq 内存为了有效使用ActiveMQ,了解ActiveMQ如何管理内存和磁盘资源以处理非持久性消息和持久性消息非常重要。 ActiveMQ具有三个关键参数,需要对其进行检查。 临时使用百分比 这是已用于假脱机非持久消息的已分配磁盘存储的百分比 非持久性消息…

视频光端机选型及常见品牌

从发送到光纤上的信号来分,视频光端机可分为基于模拟技术的模拟光端机和基于数字技术的数字光端机,模拟光端机其工作原理不外乎调制解调、滤波和信号混合等。不论是LED还是LD,其光电调制特性都不是线性的,在信号传输过程中难免出现…

视频光端机音频出现噪音是为何?

视频光端机可以说是在安防监控领域中应用非常的广泛了,但是,当我们在使用视频光端机的时候,有时候会遇到音频出现噪音的故障,那么这是何种原因导致的呢?接下来我们就跟随飞畅科技的小编一起来详细了解下吧!…

视频光端机在安防监控工程中的常见技术问题

视频光端机的技术无论是在国外还是国内都已经渐渐成熟,在不断改进和升级后,其寿命也在大大增加,但电子产品除了本身问题之外,也很容易受到外部环境或者人为操作的影响,下面我们就来介绍下视频光端机在安防监控工程中的…

[渝粤教育] 武汉理工大学 数据机构 参考 资料

教育 -数据机构-章节资料考试资料-武汉理工大学【】 线性表算法练习 算法复杂度计算测验 1、【单选题】以下算法的时间复杂度为void fun(int n) { int il; while(in) ii2; } A、O(n) B、O(n^2) C、 O(nlog2n) D、 O(log2n) 参考资料【 】 2、【单选题】设n是描述问题规模的非负…

视频光端机怎么连接 视频光端机接法图解

视频光端机可以说是在监控领域应用非常的广泛,那么,我们在使用的过程中该如何连接呢,在连接过程中需要注意哪些事项呢?接下来就由杭州飞畅的小编来为大家详细介绍下视频光端机的连接方法和一些注意事项吧! 视频光端机…

具有PreAuthorize的Spring方法安全性

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 本教程将探讨使用Spring Security在Spring Boot中配置身份验证和授权的两种方法。 一种方法是…

数字音频光端机的工作原理及其应用介绍

数字音频光端机在通信系统中可以说是应用非常广泛,特别是在安防系统、智能交通监控系统、远程多媒体教学、校园监控、长距离广播电视传输系统、楼宇控制系统等,可以说我们的日常通讯是离不开音频光端机的。接下来就由飞畅科技为大家详细介绍下数字音频光…

[渝粤教育] 湘潭大学 土力学 参考 资料

教育 -土力学-章节资料考试资料-湘潭大学【】 1-1 土的形成随堂测验 1、【单选题】长江三角洲位于从长江入海口,该地的土主要为( )。 A、坡积土 B、冲积土 C、风积土 D、冰碛土 参考资料【 】 2、【填空题】岩石的风化可分为物理风化和 。 A、…

网络光端机产品特点及实际应用范围详解

在远程光纤传输中,光缆对信号的传输影响很小,光纤传输系统的传输质量主要取决于光端机的质量,因为光端机负责光电转换以及光发射和光接收,它的优劣直接影响整个系统,所以就需要众多新用户或对此有意向的用户对光端机的…

[渝粤教育] 盐城工学院 水处理微生物学 参考 资料

教育 -水处理微生物学-章节资料考试资料-盐城工学院【】 第1章 绪论-单元作业 第2章 微生物的纯培养和显微技术-单元作业1 第2章 微生物的纯培养和显微技术-单元作业2 第1章第2章-单元测验1 1、【单选题】最关键、最本质的微生物特点是( )。 A、体积小、…

几种常见光端机的作用介绍

可能很多人对于光端机这种设备比较陌生,有些就算是知道但也了解的不多,其实光端机就是一个延长数据传输的光纤通信设备,它通过信号调制、光电转化等技术,来达到远程传输的目的。今天,杭州飞畅的小编来告诉大家一些常见…

音频光端机的几个重要指标

音频光端机是一种音频设备,发射端把传统的音频模拟信号转换成光信号,通过光纤传输到接收端,在接收端再转换成模拟信号。今天,飞畅科技的小编就来为大家详细介绍下音频光端机的几个重要指标,感兴趣的朋友就一起来看看吧…

[渝粤教育] 西北大学 仪器分析 参考 资料

教育 -仪器分析-章节资料考试资料-西北大学【】 第一讲 光分析方法的基本概念单元测验题 1、【单选题】光谱分析法是一种( )来确定物质的组成和结构的仪器分析方法。 A、利用物质与光相互作用的信息 B、利用光的波动性 C、利用光的粒子性 D、利用物质的折…

音频光端机的选择

音频光端机就是发射端把传统的音频模拟信号转换成光信号,通过光纤传输到接收端,在接收端再转换成模拟信号的一种音频设备。用户在选择音频光端机的时候一般情况下是从它的相关参数和实用性方面来考虑,相关的技术参数在光端机出厂说明书中都有…

音频光端机简单故障处理

音频光端机是在通信系统中应用比较广泛的一种设备,目前在高速公路、交通、电子警察、监控、安防、工业自动化、电力、海关、水利、银行等领域,视频图像、音频、数据、以太网等光端机已开始普遍大量应用。但是,我们在使用音频光端机的过程中难…