JVM 堆内存监测的一种方式,性能调优依旧任重道远

  • 木环

2016 年 9 月 18 日

话题:JavaJVM语言 & 开发架构其他APM

上月,由极客邦、InfoQ 和听云联合主办APMCon 2016 中国应用性能管理大会圆满落下帷幕。会上,Oracle Java Champion 荣誉得主 Martijn Verburg分享了《Java and the Machine (Why analytics matter)》,讨论了为什么数据分析至关重要。他有着十多年 Java 经验,目前是创业公司 jClarity 的 CEO,jClarity 是一款采用统计和机器学习来探究性能问题根源的方案。会后,InfoQ 还专访 Martijn 以进一步了解沟通。

Java 和 JVM 面临怎样的困境?

Martijn 分享了他对 Java 现状和 JVM 性能调优的担忧和思考,他认为现在 Java 和 JVM 面临下面五个问题:

  1. Write Once Run Anywhere 是 Java 的特色,但是这也意味着 Java 需要解决来自各方面的差异:

    CPU 的差异——什么时候可以放入缓存中呢?什么时候可以被重新排序呢?

    文件系统的差异——不同操作系统对文件的符号链接有不同机制

    原生库支持的差异——所有的原生库都不一样

    操作系统线程管理的差异——线程的调度方式很不相同

    显示设备的发展——硬件更新速度很快,几乎无法追上。面对正在迅速发展 AR、VR,Java 缺少真正的 GPU 支持,这是一个短板。
  2. 强内存模型带来的成本

    JVM 看重的是正确性,而性能则是次要的。比如锁机制加强了正确性,但是在性能上付出了巨大的代价。
  3. 垃圾回收机制对扩展性的影响

    JVM 需要维护活的对象,这意味着:堆需要更大空间以存放更多的对象;垃圾回收机制需要花时间去辨认哪些是活的对象;在垃圾回收过程中需要耗费时间进行堆的维护。

    其次,Java 中没有值类型(value type 和 reference type 的区别),没有结构体:这造成了大量低效能的对象创建。
  4. 容器和虚拟化的支持

    Java 没法获取虚拟化数据。Java 和 JVM 的思考模式是建立在物理裸机上的,信息缺失的情况下会进行一些错误选择。并且,没有对 Docker 等容器技术的直接支持,这是新时代的另一个短板。

关于 Java 和 JVM 性能调优的思考

除了上述的整体层面的挑战之外,Java 的性能本身又很难监测。必须结合其他的指标来间接把控:CPU,内存;接口 I/O,网络 I/O;虚拟化和容器化等。可是一旦获得了这些指标,又带来了大数据的问题。因为我们盲目地收集了过多的数据,这造成了巨大的性能损害,因为收集、传输、存储每个过程都是一种消耗。

要记住目的是分析获得信息,而不是收集指标。但是从指标数据到提炼出有用信息很难,Martijn 认为要做好性能调优需要明白规律和原理(如 Little's law 和 Amdahl’s law),理解硬件、操作系统、Java 工作原理还要读懂代码,并且已经有了基于大量数据的分析经验。

Martijn 认为未来性能监测的趋势是高级统计和机器学习方式的结合,这种模式将取代传统的单纯指标采集模式。

对话 Martijn

InfoQ:通常来说,JVM 层面的 APM 工具并不适用于生产环境。那为什么您称 jClarity 可以?

Martijn:与其他工具相比,首先在 JVM 层面上我们获取更少的数据。 jClarity 之所以可以更少地获取,是因为我们采用了机器学习的办法,辨别除了哪些才是真正有用的数据,我们称之为“信号”,余下的数据我们称之为噪声。在收集数据过程中,一旦检测噪声,我们立刻对过滤。

其次我们还会尽可能避免从 JVM 本身获取数据,取而代之从 JVM 的日志中(如 GC 日志、safepoint 日志)等获取数据。目前我们还在和 Google 合作,在尝试怎样从 JVM 之外,获得更多的信息。但是,总体而言,jClarity 用于生产环境是没有问题的。

InfoQ:为什么还要收集 JMV 的日志之外的数据呢?

Martijn:因为 JVM 日志并不能给我们足够的信息。你可以从 JVM 日志中获得,或者通过 JMX 接口。不过,你也可以通过设定一个 Java 或者原生的 agent 来获得更特定的信息;但这是一种过重的做法,通常而言并不推荐。很多人包括 Oracle 在内都意识到了这个问题,但是完全解决有待时日。

InfoQ:数据收集的过程是否对用户来说是透明的呢?是否支持 ASM 字节码织入技术呢?

Martijn:是的。底层的数据,我们不仅仅从 Java 中获得,还会从操作系统中获取。比如,当用户在 Linux 上运行,那么他还会看见收集到的 CPU、内存使用率等信息。

对于有特殊需求的用户,他们是可以采用 ASM,此外我们也提供一个开发阶段使用的库,但是建议用户小心使用,因为很容易会产生操作不当。

InfoQ:数据收集之后,jClarity 根据机器学习出来的成果进行了处理,能否和我们分享下机器学习的事情?

Martijn:我想分享这里非常重要的一点:我们有大量多环境的用户数据,用户们的程序也是多种多样,如网页程序、视频流程序等;我们会施加不同的网络压力,这样我们得到了数据训练集。这些数据集是专家人工操作产生的。同时在实时收集处理数据的时候,我们也会进行机器学习。比如发现 Java 性能受到影响,机器学习认定最重要一个因素就是 GC 垃圾回收,那么接下来就是调查 GC;如果 GC 没有问题,那么就会在机器学习成果的指引下开始下一个因素的勘察。总体而言,机器学习的决定了发生问题时排查的路径。

机器学习这部分的研发工作我们做了两年,也很感谢这些用户为我们付费并且同意我们这样做。我们的一些用户拥有超大规模,这种情况下,已经无法指望人工对数据进行分析;所以对于我们来说,机器学习是唯一的出路,唯一的方式可以让我们继续支持用户。

InfoQ:APM 工具的挑战有哪些?

Martijn:首先是 IT 环境复杂性的加剧。你的代码不再跑在你自己的机器和环境中,你无法做到 100% 确定你的程序和代码是怎样被管理的。另外一个挑战就是网络是不稳定的。在有线光纤专用网络上,你不需要和其他人共享;但是在公用云上,网路流量徒增的情况时有发生,开发人员不得不在代码层面上面对这个挑战,APM 工具也必须理解并迎面这个问题。目前,还没有哪个 APM 工具可以胜任这两个挑战,所以目前这还是一个非常有趣有待研究的领域。

InfoQ:您在演讲中有提到,Java 创立之初硬件并没有今天这样复杂,那么是不是说 Java 已经不再适合今天了呢?你认为 Java 语言的独特魅力在哪里呢?

Martijn:“Java 将死”的留言每年都有。Java 语言这么多年,经常遇到新兴语言的挑战,但是新兴语言很快就会发现自己也处于一个类似的局面。我认为 Java 依然是一个合适的语言,JVM 正在尝试在各种情况下都做到最好。我们可以看到 Go、RUST 语言变得越来越火,但是 Oracle 正在非常努力地攻克这点,包括更频繁地发布 Java,也很想快速地跟上包括支持 GPU、其他新型硬件设备等。所以说挑战是有的,但是令人高兴的是很多大公司都愿意继续努力提高 Java。我希望 Java 社区可以更开放些,可以欢迎更多的公司参与,比如阿里巴巴,阿里巴巴可能是全球上最大的重度 Java 研发群。

Java 的魅力在于易写性、强可读性。不像现在的一些语言,你不需要严格地按照某种规范来写代码。就算代码写完五年之后,新来的人依然可以读懂代码。还有就是 Java 丰富的框架和库。甚至这些框架和库的魅力可以和 Java 语言本身相媲美。

感谢臧秀涛对本文的审校。

JavaJVM语言 & 开发架构其他APM