Java与本机代理–他们所做的强大功能

在安装代理之前应了解的内容以及它如何影响您的代码

在构建可伸缩的服务器端应用程序时,我们花费大量时间思考如何在生产中监视,操作和更新代码。 已经开发出一种新的工具来帮助Java和Scala开发人员做到这一点。 它们中的许多都是基于最强大的方法之一构建的,其中外部代码可以在运行时与JVM集成在一起-Java代理代理商

代理是OS本机或Java库(我们将在下面描述它们之间的差异),JVM提供的这些功能是普通应用程序代码所不具备的。 为了了解它们的基本原理,让我们看一下我们使用的依赖它们的一些工具–

  • 探查器使用Java代理修改目标框架的代码,以注入收集性能指标的新代码。 这包括独立或托管服务,例如NewRelic或YourKit。
  • Play框架 V1使用Java代理在运行时启用类的热交换。
  • JRebel通过构建一种可以在运行时提供平滑的类热交换而无需重新启动JVM的技术,将其带入了一个新的高度。
  • Takipi,我们利用JVM提供给本机代理的低级功能来显示导致错误的实际源代码和变量值。

代理商可以做什么?

正如我上面提到的,有两种代理-Java和本机。 两者以几乎相同的方式(使用特殊的JVM启动参数)加载到JVM中时,它们的构建方式和用途几乎完全不同。

让我们看一下两个–

Java代理

Java

Java代理是.jar文件,它们定义一个特殊的premain静态函数,在调用应用程序的主函数之前,JVM将先调用该静态函数。 神奇的部分来自Instrumentation对象,该对象由主机JVM作为参数传递给该函数。 通过保留该对象,代理程序的代码(否则,其行为就像由根类加载器加载的任何Java代码一样)可以做一些真正强大的事情。

public static void premain(String agentArgs, Instrumentation inst) {
myInst = inst; //grab a reference to the inst object for use later
}

他们做什么 。 赋予代理的最强大功能是在运行时类(字段结构是不可变的)上动态重写目标类方法内容的能力。 此过程称为字节码检测,使代理能够在代码运行时实质上重写方法的内容。

一些示例包括添加对特定方法的调用以概要分析性能(例如,结束时间–开始时间)或记录参数值(例如,传递给Servlet的URL)。 另一个示例是重新加载类的新版本,而无需重新启动JVM(如JRebel所做的那样)。

怎么做的 。 对于代理修改代码或已加载的类,它实际上触发了JVM重新加载类的过程,在该过程中,该类的字节码被替换为新版本。 这就要求代理能够向JVM提供可验证的新字节码(即符合JVM规范)。 不幸的是,在运行时生成正确的字节码并不是一件容易的事–有很多要求和边缘情况。 对于此代理,通常使用一个库来读取和写入字节码,从而使他们能够将现有类的字节码加载到类似DOM的结构中,通过添加性能分析调用等内容对其进行修改,然后将DOM保存回原始字节码。 ASM为此而广受欢迎。 如此流行,以至于Sun的一些内部代码实际上已使用它来解析Java中的字节码。

本地代理

本机

本地代理人是完全不同的野兽。 如果您认为Java代理可以让您做一些很酷的事情,那么请坚持一下,因为本机代理在不同的层次上运行。 本机代理不是用Java编写的,而是大多数用C ++编写的,并且不受常规Java代码操作的规则和限制的约束。 不仅如此,它们还具有称为JVM工具接口(JVMTI)的极其强大的功能集。

他们做什么 。 jvmti.h公开的这套API实际上使JVM动态加载的C ++库能够获得对JVM实时工作的极高可见性。 这涵盖了广泛的领域,包括GC,锁定,代码操纵,同步,线程管理,编译调试等等。

JVM TI旨在使JVM尽可能透明,同时仍保持设计灵活性,以允许JVM供应商提供不同的基础实现。 这套API非常广泛,实际上包含了数百个JVM回调和函数。 您可以使用它们来执行Java代理无法完成的功能非常强大的事情,例如编写自己的调试器或构建底层的实时错误分析工具( Takipi就是这样)。

例如,这是JVMTI提供给代理的回调,因此,只要在JVM内部的任何地方引发异常,代理都会收到引发异常的字节码位置,所有者线程,异常对象和如果/在哪里被捕获。 确实功能强大。

void JNICALL ExceptionCallback(jvmtiEnv *jvmti,
JNIEnv *jni, jthread thread, jmethodID method,
jlocation location, jobject exception,
jmethodID catch_method, jlocation catch_location)

缺点 。 如果我描述的所有内容听起来都像桃子一样,您可以问为什么不是所有代理都写成本地代理? 没有什么理由可以知道,因此这里是(没有特定的顺序)。

复杂性 。 首先是JVMTI API非常复杂,有很多小的移动轮,在大多数情况下,如果您不连接需要非常低级功能的代理,那么Java代理API可以满足您的要求更直接,可以帮助您更快地完成工作。

可移植性 。 由于本机代理是作为本机库(.so / .dll)编写和编译的,因此需要在要支持的任何数量的操作系统上进行编译和测试。 如果您查看Windows,OSX和Linux带来的不同风格,则可以转化为大量工作。 将其与Java代理进行比较,该Java代理由JVM作为Java代码执行,因此在设计上具有固有的可移植性。

字节码操作。 由于本机代理程序通常是用C ++编写的,这意味着它们不能直接使用经过尝试的和真正的Java字节码操作库(例如ASM),而不必使用JNI返回JVM,这确实会带来一些乐趣。

稳定性 。 JVM提供了强有力的保护措施,以防止代码执行会导致恼怒的OS终止进程的事情。 在正常情况下会导致SIGSEV并导致进程崩溃的内存访问冲突,请给我们包装一个不错的NullPointerException。 由于本机代理程序在JVM的同一级别上运行(与Java代理程序由其执行代码)相同,因此它们所犯的任何错误都可能会终止JVM。

希望这有助于突出两种之间的某些区别。 了解什么是代理以及它们是如何构建的,这是很好的,即使您从未最终编写过代理,也可能依靠其中的一个或多个来为您的应用程序提供动力。

参考: Java与本地代理– Takipi博客上我们JCG合作伙伴 Iris Shoor 的强大功能 。

翻译自: https://www.javacodegeeks.com/2014/01/java-vs-native-agents-the-powerful-things-they-do.html

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

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

相关文章

pdf打印机安装程序_CAD快速出打印PDF格式文件

pdf最大的特点就是只能查看,不可编辑。我们肯定不能够直接给到客户CAD源文件,所以我们需要把CAD文件格式,转换成为PDF格式。PDF格式,比起CAD文件,能够更好的阅览CAD是不能够直接生成PDF格式的,所以我们需要…

javascript(1)

js是ajax/jquery/extjs的基础。 js的应用,比如百度地图网页版,用鼠标拖拽画面,然后画面会刷新,这就是用js实现的。 只要涉及到鼠标的响应,按键的响应都和js有关。 写网页版地图需要调用谷歌的api。 JavaScript所讲内容…

如何将html特殊字符编码转换成特殊字符_html十进制编码字符转回来

备注:有时候我们会莫名其妙遇到一些特殊字符: 这些字符在网页上能正常显示,但是在APP特殊情景并不识别这些字符: 如: 这个其实是单引号: 百度后发现,它其实是HTML特殊字符的十进制编码&#…

JavaScript之预编译

JavaScript执行步骤 1.检查通篇的语法错误2.预编译过程3.解释一行,执行一行 1 (a)2 test()3 function test() {4 console.log(1) // 15 }6 7 (b)8 console.log(a); // undefined9 var a ; 10 11 函数申明整体提升,变量只有申明提升…

使Netty 4中的HTTP内容压缩工作

Netty确实是一个很棒的框架,提供了构建高性能HTTP服务器所需的所有功能。 令人高兴的是,几乎所有东西都是开箱即用的,只是必须以正确的方式组合在一起。 内容压缩 (gzip或deflate)也不例外。 但是,在压缩静…

sap生产工单报工_【案例】MES系统助力亨通电缆车间生产效率提升25%

一、企业简介江苏亨通电力电缆有限公司是亨通集团旗下的一家重点高新技术企业,于2003年在上交所成功上市,属于上市公司的电力传输板块。公司目前已拥有超高压电力电缆、超高压海缆、中低压电力电缆、电气装备用电缆、特高压导线、电力光缆以及铜铝加工等…

mysql 二叉树表设计_mysql---B+tree索引的设计原理

1.什么是数据库的索引每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序…

JS_单个或多个文件上传_不支持单独修改

A-From表单直接填写提交地址&#xff0c;不过干预&#xff1a; 1. 单文件上传 最简单的文件上传&#xff0c;是单文件上传&#xff0c;form标签中加入enctype"multipart/form-data"&#xff0c;form表单中有一个input[type"file"]项 <form name"…

一些算法学习的推荐博文阅读(数论居多,图论没有)

上面是自己的学习笔记&#xff0c;下面是推荐博文阅读 关于每个知识点的阅读顺序若不加序号一般是并列的&#xff0c;有序号的话一般是推荐看&#xff08;当然一知半解的话可以从头看起也可以从中间开始&#xff09; 另外&#xff0c;有的链接放在推荐的下面了 另另外&#xff…

scipy是python下的什么_SciPy是什么

SciPy是一个开源的Python算法库和数学工具包。 SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。SciPy 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线…

解码Java.Lang.OutOfMemoryError:PermGen空间

Java开发人员最不了解的领域之一是垃圾收集。 Java开发人员认为JVM负责垃圾收集&#xff0c;因此他们不必担心内存分配&#xff0c;释放等问题。但是&#xff0c;随着应用程序变得越来越复杂&#xff0c;垃圾收集也会变得越来越复杂&#xff0c;一旦性能变得复杂&#xff0c;性…

Python_报错:IndexError: list assignment index out of range

今天发现一个报错&#xff0c;卡了好几个点&#xff0c;后来发现原因后&#xff0c;脸上三条黑线&#xff0c;尴尬啊&#xff01;&#xff01;&#xff01; 报错&#xff1a;IndexError: list assignment index out of range 原因&#xff1a;split()写法转成列表就会认作一个整…

mysql跨服务器查询插入_Oracle跨服务器查询插入数据

想实现insert into 当前库表 select 远程库中的表数据这种方式的数据同步&#xff0c;于是配置了一下oracle服务&#xff0c;远程和本地服务都是oracle 一、在当前库中插入数据 1 2 create public database link remotedb connect to username identified by password using db…

angular-JS模仿Form表单提交

直接上示例代码&#xff0c;有不懂的欢迎留言&#xff1a; $http({url: "http://localhost:10086/yuanxin/Conference/ImportExcelDataForBusRoute",method: Post,headers: {Content-Type: multipart/form-data },data: { BusRoute: file, ConferenceID: "1&…

想要更快地使用AtomicLong? 等待它。

我经常听到Java原子类型&#xff08;java.util.concurrent.atomic&#xff09;超级快&#xff0c;可以很好地与高度并发的代码一起使用。 在大多数情况下&#xff0c;原子以健壮和高效的方式发挥作用。 但是&#xff0c;在某些情况下&#xff0c;原子类型上非托管争用的隐藏成本…

994. 腐烂的橘子

994. 腐烂的橘子 在给定的网格中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。每分钟&#xff0c;任何与腐烂的橘子&#xff08;在 4 个正方向上&#xff09;相邻的新鲜橘子都会腐…

python爬虫简历范文_爬虫数据解析,简历模板下载!想收我Q,不存在的!

目标网址代码基础代码&#xff1a;第一页模板下载import requestsfrom lxml import etreeif __name__ __main__:headers {User-Agent: Mozilla / 5.0(Windows NT 6.1; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 86.0.4240.198 Safari / 537.36}# 免费下…

java获取页面标签_java获取网页源代码后,提取标签内容……

java获取网页源代码后&#xff0c;提取标签内容……关注:245 答案:2 mip版解决时间 2021-02-01 09:11提问者咏b琂败2021-01-31 13:49import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.ne…

C#数字,日期格式化:String.Format

C#:String.Format数字格式化输出 int a 12345678; //格式为sring输出// Label1.Text string.Format("asdfadsf{0}adsfasdf",a);// Label2.Text "asdfadsf"a.ToString()"adsfasdf";// Label1.Text string.Format("asdfadsf{0:C}adsfasdf…

jquery中点击切换的实现

项目中经常会遇到一种情况&#xff0c;就是点击切换&#xff0c;比如点击按钮&#xff0c;div样式为1&#xff0c;再点击一下按钮&#xff0c;div样式为2&#xff0c;再点击一下按钮&#xff0c;div样式为1。需要自定义jQuery方法toggle。 // toggle方法$.fn.toggle function(…