当前位置: 首页 > news >正文

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

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

\\

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

\\

关键要点

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

点击播客链接收听

\\

摘要

\\

OverOps

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

SaaS与On-Premise

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

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

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

和字节码一起工作

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

Java开发中的常见错误

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

资源

\\
  • InfoQ电子书:Java代理和字节码。\\t
  • Github上的基础JVM代理项目。\\t
  • O'Reilly的课程:调试Java和Scala语言。\

字节码操作框架

\\
  • ASM。Weiss在JavaOne演讲中谈到了ASM框架和Eclipse插件(Bytecode Outline)\\t
  • AspectJ\\t
  • BCEL\\t
  • Byte Buddy\\t
  • CGLIB\\t
  • Cojen\\t
  • Javassist\\t
  • Serp\

更多关于播客的信息

\\

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

\\

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

相关文章:

  • 路由器测试的类型和方法
  • 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
  • ccna视频第四讲
  • springmvc获取参数
  • seo工具总结
  • 基础练习 数列排序
  • 当爱已成为过去
  • C语音键盘钩子和用法 模拟键盘
  • ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
  • 详细介绍SQL交叉表的实例
  • mysql随机取3条数据以及优化
  • Google请人为Android挑刺
  • java中的异常理解
  • CSS-border属性制作小三角
  • Net几种常用传值方式
  • 2017届校招提前批面试回顾
  • Druid 在有赞的实践
  • E-HPC支持多队列管理和自动伸缩
  • Git初体验
  • Git学习与使用心得(1)—— 初始化
  • Joomla 2.x, 3.x useful code cheatsheet
  • mysql innodb 索引使用指南
  • MySQL主从复制读写分离及奇怪的问题
  • nodejs实现webservice问题总结
  • PHP CLI应用的调试原理
  • Terraform入门 - 1. 安装Terraform
  • 初探 Vue 生命周期和钩子函数
  • 聊聊directory traversal attack
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一些关于Rust在2019年的思考
  • # 达梦数据库知识点
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (第61天)多租户架构(CDB/PDB)
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (十一)c52学习之旅-动态数码管
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Sql Server 保留几位小数的两种做法
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)利用webkit抓取动态网页和链接
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 提取注释生成API文档 帮助文档
  • .Net6 Api Swagger配置
  • .net连接MySQL的方法
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .net中应用SQL缓存(实例使用)
  • .Net组件程序设计之线程、并发管理(一)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化