-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,一经查实,立即删除!

相关文章

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

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

[渝粤教育] 四川农业大学 宏观经济学 参考 资料

教育 -宏观经济学-章节资料考试资料-四川农业大学【】 测试题1 1、【填空题】GDP是一国或一地区在一定时期内所生产的全部( )的市场价值总和。 A、 参考资料【 】 测试题2 1、【单选题】GDP是一个( )的概念。 A、流量 B、存量 C、…

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

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

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

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

[渝粤教育] 天水师范学院 地质与地貌学 参考 资料

教育 -地质与地貌学-章节资料考试资料-天水师范学院【】 绪论作业 绪论测试 1、【单选题】1、地质学的研究对象是地球,目前仅局限于地球的表层部分,即()。 A、岩石圈 B、水圈 C、大气圈 D、生物圈 参考资料【 】 2、【判断题】2、…

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

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

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

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

[渝粤教育] 天津中德应用技术大学 素质修养与心理健康(刘萍) 参考 资料

教育 -素质修养与心理健康(刘萍)-章节资料考试资料-天津中德应用技术大学【】 单元测试 1、【单选题】21世纪新健康观包含( ) A、身体良好、心理健康、社会适应和道德品质 B、身体良好、心理健康、社会适应 C、身体良好、心理健康…

[渝粤教育] 天津师范大学 创业起跑线 参考 资料

教育 -创业起跑线-章节资料考试资料-天津师范大学【】 随堂测验 1、【单选题】创业的本质是什么? A、追寻机会 B、创造价值 C、节约成本 D、利用资源 参考资料【 】 2、【多选题】价值创造的两个关键要素是()。 A、融资方案 B、用户痛点 C、解…

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

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

[渝粤教育] 宁波财经学院 金融工程学 参考 资料

教育 -金融工程学-新-章节资料考试资料-宁波财经学院【】 1.1 随堂测试 1、【多选题】从交易层面来看,属于零和游戏的有: A、股票 B、期货 C、期权 D、互换 参考资料【 】 2、【判断题】远期合约出现的比期货合约早。 A、正确 B、错误 参考资料【 】 3、…

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

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

[渝粤教育] 山东大学 英语话中华 参考 资料

教育 -英语话中华-章节资料考试资料-山东大学【】 Unit 2 Assignment Unit 2 Quiz 1、【单选题】Which ceremony is held at the Confucius Temple in Qufu every year? A、Confucius Temple Ceremony. B、Confucius Memorial Ceremony. C、Confucius Anniversary Ceremony. D…

[渝粤教育] 山东财经大学 国际金融 参考 资料

教育 -国际金融-章节资料考试资料-山东财经大学【】 当前我国国际收支平衡表的依据是什么? 1、【填空题】当前我国国际收支平衡表的依据是什么? A、 参考资料【 】 国际收支平衡表内容 1、【单选题】将国际收支账户中官方储备剔除后的余额是( ) A、贸易收…

视频光端机的应用领域有哪些?

随着社会的高速发展,我们在平时工作之余,更加注重精神生活的享受,对于一些公共的娱乐地点需求比较的旺盛,但是由于这些公共的地点人员比较的多,比较的复杂,所以视频监控可以发挥重要的作用。经过多年的发展…

q7goodies事例_Java 8 Friday Goodies:轻松派本地缓存

q7goodies事例在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个…

[渝粤教育] 扬州工业职业技术学院 微言品语文 参考 资料

教育 -微言品语文-章节资料考试资料-扬州工业职业技术学院【】 随堂测验 1、【单选题】 明朝岳岱的诗歌《邗沟》中“隋皇昔日锦帆游,吴楚分疆是此沟。” “此沟”是指( ) A、长江 B、黄河 C、湘江 D、古邗沟 参考资料【 】 2、【单选题】公元…

[渝粤教育] 无锡商业职业技术学院 团队管理 参考 资料

教育 -团队管理-章节资料考试资料-无锡商业职业技术学院【】 模块1 团队起源与发展随堂测验 1、【单选题】团队应该有一个既定的(),为团队成员导航,知道要向何处去,没有()这个团队就没有存在的价…

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

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

[渝粤教育] 武汉交通职业学院 现代物流管理概论 参考 资料

教育 -现代物流管理概论-章节资料考试资料-武汉交通职业学院【】 单元测验(一) 1、【单选题】物流系统的一般要素不包括( )要素 A、人的要素 B、物的要素 C、地点要素 D、资金要素 参考资料【 】 2、【单选题】物流对宏观经济的作…