BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

InfoQ播客:Tal Weiss谈JVM的可观测性、插桩、以及字节码操作

| 作者 Wesley Reisz 关注 16 他的粉丝 ,译者 于航 关注 1 他的粉丝 发布于 2016年12月1日. 估计阅读时间: 9 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

在本周的InfoQ播客中,QCon主席Wesley Reisz与Tal Weiss进行了对话。Weiss是OverOps公司的首席执行官,其公司OverOps的前身是Takipi。此次对话的内容涵盖了OverOps产品的运作机制,深入探讨了JVM的插桩和可观测性之间的区别,谈论了字节码操作的方法和在Java开发中的常见错误。

Weiss在过去的15年里设计了很多可扩展的、实时的Java和C++应用。他曾经是VisualTao公司的联合创始人兼首席执行官,如今这家公司已经在2009年被Autodest收购。他也曾在IAI空间研究所担任软件架构师,主要关注分布式、实时的卫星跟踪技术和相关的控制系统。

关键要点

  • OverOps在应用部署时使用了一种机器代码插桩和静态代码分析的混合技术来构建一个代码的索引。
  • 可观测性是指你应该如何设计你的代码架构,才能够从它的输出中捕获有用的信息。插桩是指你通过字节码或者机器码操作技术从系统的外部进入到内部来捕获一些信息,这整个过程发生在系统被设计并构建完成之后。
  • 大多数公司都可以从学习字节码插桩技术的过程中受益。字节码不是机器码 —— 而是一个高层级的编程语言。如果能够读懂字节码,会在很大程度上帮助你理解JVM的运作机制。
  • 有很多的字节码操作工具可以供你使用来操作字节码 —— 比如ASM这个为大多数人所知的工具。
  • 在一个应用程序的生命周期内,绝大部分的日志记录都来自很小的一部分系统事件。一个很好的习惯是定期去查看你的日志记录,确保你记录了正确的、有价值的信息。

点击播客链接收听

摘要

OverOps

  • 1分21秒:OverOps允许你通过添加到日志文件中的微小连接查看到整个调用堆栈的源代码和变量的状态。
  • 3分00秒:为了以一种开销小于1%的高性能的方式做到这一点,产品必须定位于JVM和处理器之间。
  • 3分44秒:OverOps在应用部署时使用了一种机器代码插桩和静态代码分析的混合技术来构建一个代码的索引。这种机制避免了在运行时环境下使用元数据或者反射。取而代之的是,OverOps能够在一个底层环境中捕捉到原始的内存状态并且将其重建到源代码中。

SaaS与On-Premise

  • 5分44秒:OverOps刚开始时被作为一个SaaS产品,但考虑到它收集到的大量数据中含有很多潜在的敏感信息,我们便引入了一个新产品,这个产品被命名为Hybrid。 Hybrid会将数据分成两个独立的流:数据流和元数据流。
  • 6分42秒:其中,数据流是捕获到的原始数据,然后会对原始数据使用256位AES加密密钥进行私有加密,这个256位AES加密密钥只会存储在生产机器上,并且当用户在需要解密时使用。元数据流不包含敏感信息,因为它只是一个抽象的数学图。
  • 7分18秒:因为数据流已经被私钥加密,所以该数据流可以被存储在防火墙后面,并且不需要脱离公司的内部局域网。
  • 7分39秒:对于一些知名的银行和电信公司而言,法律监管的限制致使他们无法使用这种混合的SaaS方法,OverOps提供了一个后端的Docker容器,这个容器允许你在其内部运行整个系统。
  • 8分24秒:作为一个初创企业,你需要能够同时进行基于SaaS方法和Docker容器的内部部署。如果你只进行了基于SaaS方法的部署,你将从多个账户中被锁定。

插桩(Instrumentation)与可观测性(Observability)

  • 8分59秒:可观测性是指你应该如何设计你的代码架构,才能够从它的输出中捕获有用的信息。插桩是指你通过字节码或者机器码操作技术从系统的外部进入到内部来捕获一些信息,这整个过程发生在系统被设计并构建完成之后。
  • 10分24秒:JVM允许字节码插桩,因此你可以通过补丁来增加额外的字节码,并让JIT编译器将这段字节码取出并重新编译。这项技术通常用于性能管理。
  • 11分14秒:你还可以像OverOps一样进行机器码的插桩。这样做的优点是,你可以在更加接近底层的地方进行操作,这种底层操作会带来很明显的速度上的提升。但是,你必须为特定处理器来编写不同的机器码,这样做会失去平台的独立性,而且这种机器码的编写本身也是很有难度的。

和字节码一起工作

  • 11分49秒:大多数公司都可以从学习字节码插桩技术的过程中受益。
  • 13分32秒:字节码不是机器码 —— 它是一个高级的编程语言。如果你能够读懂它,它会帮助你更加深入的了解JVM的工作机制,比如JVM如何进行垃圾收集工作,了解堆栈的跟踪,配置文件等。
  • 14分30秒:一个有关字节码有趣的事是,它在JVM运行时环境下不是一成不变的。而是可以随着需求不断进行变化的。
  • 15分46秒:如果反射机制是一种可以反映对象结构的能力,那么字节码插桩技术就是一种能够反映代码结构的能力。
  • 16分40秒:Weiss为O’Reilly制作了一套课程,在课程中他会教你如何进行字节码插桩。你可以在一天之内学会这个技术。所有你需要做的事情就是给一个JAR文件添加一个属性,使该文件成为一个代理。这样做最终会给予这个代理可以在JVM层级操作代码的权限。
  • 17分41秒:一个代理会获得一个在Main方法之前执行的函数,这个函数随后会被JVM回调,JVM会在函数内提供一个插桩对象,该对象允许你查看所有已经加载的类和方法,并且你可以随时操作它。
  • 18分20秒:有很多的字节码操作工具可以供你使用来操作字节码 —— 比如ASM这个为大多数人所知的工具。
  • 19分04秒:还有一个名为ASMifier的插件,它会在你编写代码的同时,在编辑器中实时显示代码的字节码表示。
  • 20分12秒:无论您如何添加字节码,JVM都会调用字节码验证器检查字节码的语法和有效性。

Java开发中的常见错误

  • 22分27秒:在一个应用程序的生命周期内,绝大部分的日志记录都来自于很小的一部分系统事件。作为架构师,把这些事件之间的关系映射出来是很有必要的。因为有很多在日志里的信息我们是不需要的,但是我们需要的那些可能已经丢失了。
  • 25分10秒:通常,错误来自于数据验证和数据处理,数字格式不对或者索引超出范围的错误等,而不是空指针问题。发生的原因是数据总是很容易被损坏。
  • 25分55秒:与动态链接有关的类加载错误是另一类很常见的错误。
  • 26分40秒:空指针错误是相当少见的,因为开发者们对这个错误都非常敏感。
  • 27分33秒:你需要不断的查看日志并且优化它们。

资源

字节码操作框架

更多关于播客的信息

你可以通过我们的RSS feed来了解关于播客的最新情况,也可通过SoundCloudiTunes收听。本页所列出的播客摘要内容均附有可点击链接(英文原文),点击后可直接切换到音频的相关部分。

查看英文原文:Tal Weiss on Observability, Instrumentation and Bytecode Manipulation on the JVM

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT