在本周的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会在函数里提供一个插装对象,该对象允许你查看所有已经加载的类和方法,并且你可以随时操作它。
Java开发中的常见错误
- 22分27秒:在一个应用程序的生命周期内,绝大部分的日志记录都来自很小的一部分事件。作为架构师,把这些关系映射出来是很值得的。因为有很多在日志里的资料我们是不需要的,但是我们需要的那些可以已经丢失了。
- 25分10秒:通常,错误来自于数据验证和数据处理,而不是这种空指针问题、数字格式不对或者索引超出范围的错误等等。会引发这类错误都是由于“脏数据”的问题。
- 25分55秒:类加载错误和动态链接问题是另一类很常见的错误。
- 26分40秒:空指针错误是相当少见的,因为开发者们对这个错误都非常敏感。
- 27分33秒:你需要不断的查看日志并且优化它们。
资源
-
InfoQ电子书:Java代理和字节码。
-
Github上的 基础JVM代理项目
。
-
O'Reilly的课程: 调试Java和Scala语言
。
字节码操作框架
-
ASM
。Weiss在 JavaOne演讲
中部分谈到ASM框架和Eclipse插件(Bytecode Outline)
-
AspectJ
-
BCEL
-
Byte Buddy
-
CGLIB
-
Cojen
-
Javassist
-
Serp
更多关于播客的信息
最新播客可通过我们的RSS feed更新,也可通过 SoundCloud
和 iTunes
收听。本页所列出的播客摘要内容均附有可点击链接(英文原文),点击后可直接切换到音频的相关部分。
感谢足下对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina
)关注我们。
原文
http://www.infoq.com/cn/articles/infoq-podcast-tal-weiss-jvm