JVM高级篇

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系统

静态加载的应用场景

相关推荐
不止会JS1 小时前
JVM详解:垃圾回收机制
jvm
guihong0042 小时前
JAVA面试题、八股文学习之JVM篇
java·jvm·学习
gogo_hua2 小时前
JVM系列之OOM观测准备
java·大数据·jvm
柯34920 小时前
GC垃圾回收
java·jvm·垃圾回收
王佑辉20 小时前
【jvm】执行引擎是做什么
jvm
平头哥在等你21 小时前
C语言简答题答案
java·c语言·jvm
zhuzhihongNO11 天前
JVM(JAVA虚拟机)内存溢出导致内存不足,Java运行时环境无法继续
java·开发语言·jvm·内存溢出·jvm内存溢出
MaxCosmos20011 天前
读《Effective Java》笔记 - 条目7
java·jvm·笔记
学点东西吧.1 天前
JVM(六、Java内存分配)
java·开发语言·jvm