GraalVM
GraalVM是Oracle官方推出的一款高性能JDK,使用它享受OpenJDK更好的性能。
左图是OpenJdk 右图是GraalVM
1.更低的CPU、内存使用率
2.更快的启动速度,无需预热即可获得最好的性能
3.更好的安全性,更小的可执行文件
4.支持多种框架Springboot、Micronaut、Helidon、Quarkus
5.多家云平台支持
6.通过Truffle框架运行JS、Python、Puby等其他语言
GrallVM的版本
GraalVM社区版的环境搭建
需求:搭建Linux下的GraalVM社区版本环境(windows不支持)
GraalVM的两种运行模式
JIT模式
及时编译模式,与OracleJDK类似,满足两个特点:
1.一次编写,到处运行
2.预热之后,通过内置的Graal即时编译器优化热点代码,生成比Hotspot JIT更高性能的机器码
GraalVM的性能测试
AOT模式
提前编译模式
AOT编译器通过源代码,为特定平台创建可执行文件。比如,在windows下编译完成之后,会生成exe文件。通过这种方式,达到启动之后获得最高性能的目的。但是不具备跨平台特性。不同的平台使用需要单独编译
这种模式生成的文件称之为Native Image镜像
AOT模式的测试
GraalVM模式和版本的性能对比
应用场景
GraalVM存在的问题:虽然AOT模式在启动速度,内存和CPU开销上非常有优势,但是使用这种技术会带来几个问题:
解决方案:
使用Springboot3搭建GRaalVM环境
什么场景下需要使用GraalVM?
1.对性能要求比较高的场景,可以选择使用收费的企业版提升性能
2.公有云的部分业务是按照CPU和内存使用量进行计费的,使用GraalVM可以有效地降低费用
GraalVM企业级应用-Serverless架构
传统的系统架构中,服务器等基础设施的运维,安全,高可用等工作都需要企业自行完成,存在两个主要问题:
1.开销大,包括人力开销,机房建设的开销
2.资源浪费,面对一些突发的流量冲击,比如秒杀等活动,必须提前规划好容量准备好大量服务器,这些服务器在其他时候会处于闲置的状态,造成大量的浪费
serverless架构
serverless架构---函数计算
函数计算的主要应用场景有如下几种:
1.小程序、API服务中的忌口,此类接口的调用频率不高,使用的常规的服务器架构容易产生资源浪费,使用Serverless就可以实现按需付费降低成本,同时支持自动伸缩能应对流量的突发情况
2.大规模任务处理,比如音视频文件转码、审核等,可以利用事件机制当文件上传之后,自动触发对应的任务。
函数计算的计费标准包括CPU和内存使用量,所以使用GraalVM AOT模式编译出来的本地镜像可以节省更多的成本
案例2:将程序部署到阿里云函数计算
Serverless应用
函数计算的服务资源比较受限,比如AWS的Lambda服务一般无法支持超过15分钟的函数执行,所以云服务商提供了另外一套方案:基于容器的serverless应用,无需手动配置k8s中的Pod、service等内容,只需选择镜像就可以直接自动生成应用服务。
同样,Serverless应用的计费标准中包含CPU和内存使用量,所以使用GraalVM AOT模式可以节省更多成本
参数优化和故障诊断
GraalVM的内存参数
GraalVM是一款独立的JDK,所以大部分HotSpot的虚拟机参数都不适用。
实战案例4:内存快照文件的获取
案例5:运行时数据的获取
什么是GraalVM?
什么场景下使用GraalVM?
新一代的GC
垃圾回收器的技术演进
不同的垃圾回收器设计的目标是不同的,如图:
Shenandoah GC
ShenandoahGC是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah并发执行大部分GC工作,包括并发的整理,堆大小对STW的时间基本没有影响。
Shenandoah的使用方法
1.下载
2.配置
3.添加参数,运行java程序
ShenandoahGC并不是一定最好的,它在某种场景下非常慢
ZGC
ZGC是一种可扩展的低延迟垃圾回收器。ZGC在垃圾回收过程中,STW的时间不会超过一毫秒,适合需要低延迟的应用。支持几百兆到16TB的堆大小。堆大小对STW的时间基本没有影响。
ZGC降低了停顿时间,能降低接口的最大耗时,提升用户体验。但是吞吐量不佳,所以如果Java服务比较关注QPS(每次的查询次数)那么G1是比较不错的选择
ZGC的2版本更迭
ZGC的使用方法
ZGC的参数设置
需要设置的参数:
与其他垃圾回收器的对比图
ZGC的调优
实战案例
内存不足时的垃圾回收测试
总结
揭秘JAVA工具
除了java编写的业务系统之外,还有一类程序也需要java程序员参与编写,就是java工具
常见的java工具有以下几类:
1.诊断类工具:Arthas、VisualVM
2.开发类工具:Idea、Eclipse
3.APM应用性能监测工具:Skywalking、Zipkin
4.热部署工具:Jrebel
Java Agent技术
Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让java程序运行其中的代码
Java Agent的两种模式
Java Agent实现了让java程序执行独立的Java Agent程序中的代码,执行的方式有两种:
1.静态加载模式
2.动态加载模式
静态加载模式
静态加载模式可以在程序启动的一开始就执行我们需要执行的代码,适合用APM等性能监测系统从一开始就监控程序的执行性能。静态加载模式需要在Java Agent的项目中编写一个premain的方法,并打包成jar包
动态加载模式
动态加载模式可以随时让Java agent代码执行,适用于Arthas等诊断系统。动态加载模式需要在Java Agent的项目中编写一个agentmain的方法,并打包成jar包
搭建java agent静态加载模式的环境
搭建Java Agent动态加载模式的环境
实战案例1:简化版的Arthas
查看内存的使用情况
JMX技术------获得运行时信息
获取JVM默认提供的Mbean可以通过如下方式,例如获得内存信息:
查看直接内存使用情况,生成堆内存快照
打印栈信息
打印类加载器
打印类的源码
步骤:
1.获得内存中的类的字节码信息。利用Instrumentation提供的转换器来获得字节码信息。
2.通过反编译工具将字节码信息还原成源代码信息
反编译工具会使用jd-core依赖库完成
打印方法执行的参数和耗时
问:Spring AOP是不是也可以实现类似的功能?
确实可以,但是存在问题:
ASM----打印方法执行的参数和耗时
ASM是一个通用的Java字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM重点关注性能。让操作尽可能小且尽可能快,所以它非常适合在动态系统中使用。ASM的缺点是代码复杂。
步骤:
打印方法执行参数和耗时----Byte Buddy
Byte Buddy是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助。Byte Buddy底层基于ASM,提供了非常方便的API
操作步骤:
最后将整个简化版的Arthas进行打包,在服务器上进行测试。使用maven-shade-plugin插件可以将所有依赖打入一个jar包中并指定入口main方法
APM系统
静态加载的应用场景