开发者学堂课程干货总结——Java 虚拟机原理(五)

简介: Java 虚拟机原理课时1.5——Dragonwell特性:JWarmup。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!

各位同学,开发者学堂Java 图谱中Java 高级工程师篇的课程“Java 虚拟机原理”的课程给开始更新了,第五课时“Dragonwell特性:JWarmup”的干货总结来啦!一起学习新课程吧!

课程链接以及图谱地址小编已经为大家指路了,搭配学习效果更佳👇

课程名称:Dragonwell特性:JWarmup

课程地址:https://developer.aliyun.com/learning/course/56/detail/1064

图谱名称:Alibaba Java 技术图谱

图谱地址:https://developer.aliyun.com/graph/java


Dragonwell特性:JWarmup


一、JWarmup背景 

(一)应用程序预热 

Java的方法要被执行,首先这个方法所在的类需要被JVM加载,这个过程包括各类文件的验证、解析、链接以及类的初始化。当这个类被加载进来了以后,JVM就可以去执行这个方法。 

JVM在刚开始的时候会使用模板解释器去解释执行方法,模板解释器除了一个个去执行方法中的Bytecodes之外,还会额外收集关于方法执行动态运行的信息,例如方法执行的调用次数,调用时一些类型的信息等。这些信息都会提供给JVM的即时编译器,由它利用这些信息将刚才解释执行发现的热点方法编译成为Native Code。这样JVM就不用模板解释器去执行这些方法,而是去执行性能更高的Native Code,从而使应用程序的性能得到大幅提升。 

当大多数热点方法都被编译成为Native Code以后,应用程序的预热就完成了 

 

(二)遇到的问题 

Java有非常丰富的应用场景,一个典型的场景就是我们会用Java写一些 Web服务在Web服务的部署过程中,会发现预热给我们带来非常大的困扰。当我们把一个Web服务部署到线上后,应用启动完成,此时就会有大量的用户请求进入。 

这个时候由于有大量的热点方法需要被编译,JVM的编译线程会非常忙碌,因为它需要占用大量的CPU将这些方法编译成为Native Code。同时又因为用户的线程需要执行解决用户的请求,因此它也会占用大量的CPU,并且会抢占编译线程所使用的CPU,这样就会导致编译线程无法尽快把这些热点方法编译到Native Code,使得应用程序长时间运行在解释执行的状态,降低服务的质量同时服务的RT会增加,服务所使用的CPU也会非常的高,这就是在真实场景中所遇到应用程序预热的问题接下来我们来看一下阿里巴巴Dragonwell 8中的JWarmup特性是如何解决这个问题。 

 

 

二、JWarmup功能 

image.jpeg 

上方为JWarmup流程图,它将应用程序的发布分成了两个阶段,分别是Recording和Replaying。在Recording阶段,JVM会接受线上的请求,同时记录JVM即时编译器它所编译方法的信息,并且将这些信息都输出到一个文件之中。 

等到第二次再去启动的时候,JVM就可以去读取刚刚所记录的这些方法编译的信息,同时会主动的触发即时编译器编译刚刚记录的热点方法,使得在用户请求到来之前,就把热点方法编译成为性能较高的Native Code,避免了用户请求大量进入的时候做编译,这样就能够进一步提高应用程序的性能,节约CPU使用率。 

 

 

三、案例演示 

(一)Demo代码 

image.png 

下面根据一个简单的例子展示如何使用JWarmup功能 

上方为一个简单的 Java程序,在这个程序之中有一个循环用来模拟线上应用的一个热点,循环会反复调用一个方法。 

 

(二)Recording 

如何去使用JWarmup的记录功能Recording 

-XX:+CompilationWarmUpRecording 

-XX: CompilationWarmUpRecording=30 

-XX: CompilationWarmUpLogfile=./jwarmup.log 

-XX:-ClassUnloading 

第一个参数表示去打开JWarmup的记录功能 

第二个参数表示需要记录的时间,在当前Demo之中选择记录30秒 

第三个参数表示记录编译信息生成文件的路径在这个Demo中,我们将这个文件生成在当前目录下的jwarmup.log这个文件 

第四个参数由于JWarmup的Recording功能不支持ClassUnloading,所以需要将这一功能关闭。 

设定的记录时间到了以后,JWarmup会将记录好的编译信息输出到指定的文件之中,同时会在应用程序的输出中看到以下这样一条日志,表明记录是成功的。 

image.png 

 

(三)Replaying 

如何使用JWarmup的Replaying功能 

  • 添加JVM参数: 

-XX:+CompilationWarmUp 

-XX:+CompilationWarmUpLogfile=./jwarmup.log 

-XX:+PrintCompilationWarmUpDetail 

第一个参数表示使用JWarmup的编译功能 

第二个参数需要指定刚刚记录的包含编译信息的文件,在当前Demo之中,就是刚刚所记录的当前目录下的jwarmup.log文件 

第三个参数表示我希望JWarmup打印出一些详细的日志,帮助我记录JWarmup工具的一些行为 

当把这些参数配置好以后,将服务启动,等待一些关键的类的加载完成可以使用jcmd <pid> JWarmup -notify主动触发Warmup的编译。 

Warmup编译完成后,可以在程序的标准输出中看到下面三条log,就表示这一次Warmup编译是成功的 

image.png 

以上就是关于JWarmup的基本介绍,包含JWarmup所需要解决的问题,解决方法,以及用案例讲述如何使用JWarmup功能同时我们对JWarmup这个功能还做了非常多的改进,形成了我们另外一份工作:JWarmup2 

image.png 

上方为JWarmup2整体流程图,可以看到在这份工作之中,我们记录了更加丰富的信息,去更好解决应用程序预热的问题。 

首先我们会使用JFR(Java Flight Recorder)统一所记录的编译的信息,这些信息也可以形成一个JFR文件,使用JDK官方所提供的Java Mission Control浏览所记录的所有热点方法的信息 

此外我们除了记录一些方法的编译,还记录了每一个方法它所依赖的类的信息。这样子在我们第二步预热的时候,就可以根据这些依赖的信息,当我们看到一个方法,它所有的依赖的类都被加载了以后,就会自动触发这个方法的Warmup编译,避免了人工手动触发Warmup编译 

此外我们还额外记录了这些方法所有的Profiling信息,这些信息能够帮助我们在第二步去更好地生成Warmup的代码,从而进一步提高应用程序的性能 

JWarmup2未来将在阿里巴巴Dragonwell 11中开源,欢迎大家使用。 

相关文章
|
1月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
271 0
|
5月前
|
存储 缓存 Java
我们来详细讲一讲 Java NIO 底层原理
我是小假 期待与你的下一次相遇 ~
206 2
|
4月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
150 0
|
5月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
416 58
|
4月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
169 24
|
5月前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
552 13
|
4月前
|
存储 缓存 安全
深入讲解 Java 并发编程核心原理与应用案例
本教程全面讲解Java并发编程,涵盖并发基础、线程安全、同步机制、并发工具类、线程池及实际应用案例,助你掌握多线程开发核心技术,提升程序性能与响应能力。
226 0
|
5月前
|
算法 Java 索引
说一说 Java 并发队列原理剖析
我是小假 期待与你的下一次相遇 ~
|
5月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
3013 1