JVM工作原理与实战(三十六):GraalVM虚拟机

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、GraalVM介绍

二、GraalVM的两种运行模式

三、GraalVM应用场景

1.GraalVM存在的问题

2.GraalVM企业级应用-Serverless架构

3.Serverless架构-函数计算

4.Serverless架构-Serverless应用

四、参数优化和故障诊断

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了GraalVM、GraalVM的两种运行模式、GraalVM应用场景、参数优化和故障诊断等内容。


一、GraalVM介绍

GraalVM是由Oracle官方推出的一款高性能Java开发工具包(JDK),与OpenJDK和Oracle JDK相比,它为用户提供了更出色的性能。GraalVM标语为“Build faster, smaller, leaner applications”(更快、更小、更精简的应用程序开发)。GraalVM具有以下特点:

  • 低CPU和内存使用率:与传统的JDK相比,GraalVM在执行应用程序时可以显著降低CPU和内存的使用率,从而提高应用程序的性能。

  • 快速启动和预热:GraalVM能够实现快速的应用程序启动,并且无需预热即可获得最佳性能,从而缩短了应用程序的启动时间。

  • 更好的安全性:GraalVM提供了更高级别的安全性,可以更好地保护应用程序免受攻击和数据泄露等安全威胁。
  • 小型可执行文件:通过优化和压缩技术,GraalVM可以生成更小的可执行文件,从而减少了应用程序的存储空间占用。
  • 支持多种框架:GraalVM支持多种流行的Java框架,如Spring Boot、Micronaut、Helidon和Quarkus,使得开发人员可以更加方便地构建和部署应用程序。
  • 云平台支持:GraalVM已经得到了多家云平台的支持,使得开发人员可以轻松地将应用程序部署到云环境中。
  • 多语言支持:通过Truffle框架,GraalVM可以运行JavaScript、Python、Ruby等多种其他语言,从而扩展了其应用范围。

GraalVM的官方网址:

GraalVMicon-default.png?t=N7T8https://www.graalvm.org/GraalVM分为社区版(Community Edition)和企业版(Enterprise Edition)。与社区版相比,企业版在性能方面进行了更多的优化和改进,提供了更高级别的功能和特性。建议在开发高性能、安全可靠的应用程序时使用企业版GraalVM。

特性描述社区版企业版
收费是否收费免费收费
G1垃圾回收器使用G1垃圾回收器优化垃圾回收性能×
Profile Guided Optimization(PGO)运行过程中收集动态数据,进一步优化本地镜像的性能×
高级优化特性更多优化技术,降低内存和垃圾回收的开销×
高级优化参数更多的高级优化参数可以设置×

二、GraalVM的两种运行模式

JIT(Just-In-Time)模式(即时编译模式)

JIT模式是GraalVM的一种核心特性,其处理方式与Oracle JDK的JIT编译器类似。在这种模式下,GraalVM的即时编译器将Java字节码转换为本地机器码,以实现更高的执行效率。其主要特点如下:

  • 一次编写,到处运行(Write Once, Run Anywhere):这是Java的核心承诺,意味着开发者可以使用GraalVM在任何支持Java的平台或环境中编译和运行他们的代码。
  • 热点代码优化:预热之后,GraalVM的即时编译器会针对频繁执行的代码段进行优化,生成比传统的Hotspot JIT更高的性能机器码。

AOT(Ahead-Of-Time)模式(提前编译模式)

AOT模式是GraalVM的另一项创新,它允许开发人员在编译阶段就生成特定平台的可执行文件。这意味着应用程序在启动时已经预先编译为本地代码,从而实现了更高的启动速度和运行性能。其主要特点如下:

  • 本地可执行文件生成:通过AOT编译器,开发人员可以为特定平台(如Windows、Linux或macOS)生成可执行文件(如.exe、.app或.out)。
  • 启动后达到最高性能:由于应用程序在启动时已经转换为本地代码,因此无需进行额外的编译或优化,可以立即达到最佳性能。
  • 非跨平台编译:与JIT模式不同,AOT模式下生成的可执行文件不具备跨平台特性。每个目标平台都需要单独编译。
  • 本地镜像(Native Image):AOT模式下生成的文件被称为本地镜像,它们是为特定平台和配置预先编译的应用程序映像。

在选择使用GraalVM的哪种模式时,开发人员应考虑他们的应用程序需求、目标平台以及对性能、跨平台兼容性和安全性的要求。JIT模式提供了高度的跨平台兼容性和动态优化能力,而AOT模式则专注于预先编译的高性能和特定平台的可执行文件。

GraalVM模式和版本的性能对比:

三、GraalVM应用场景

1.GraalVM存在的问题

GraalVM的AOT模式虽然带来了启动速度、内存和CPU开销上的优势,但也存在一些问题需要解决:

  • 跨平台问题:由于AOT模式下的代码是针对特定平台编译的,因此在使用不同平台运行时需要进行多次编译。这增加了开发人员的工作量,并需要确保编译平台的依赖库等环境与运行平台保持一致。
  • 编译时间与资源消耗:使用AOT模式编译本地镜像时,需要较长时间,并且会消耗大量的CPU和内存资源。这可能对开发环境和持续集成/持续部署(CI/CD)流程造成影响。
  • 运行时类访问限制:AOT编译器在编译时需要知道运行时所有可访问的类。然而,Java中存在一些技术可以在运行时动态创建类,例如反射、动态代理等。这些技术在许多框架中广泛使用,如Spring框架。因此,这些框架需要与AOT编译器进行适配,以确保其功能的正常使用。

针对上述问题,以下是一些可能的解决方案:

  • 使用容器化平台:利用公有云的Docker等容器化平台进行在线编译,可以确保编译环境和运行环境的一致性。这样不仅解决了跨平台问题,还解决了编译资源问题。通过容器化技术,可以轻松地在不同的环境中构建和部署应用程序。
  • 采用整合了GraalVM AOT模式的框架版本:例如,使用Spring Boot 3等框架版本,这些框架已经与GraalVM AOT模式进行了深度整合,简化了适配过程,并可能提供了更好的性能和功能支持。

2.GraalVM企业级应用-Serverless架构

在传统的系统架构中,企业需要自行负责服务器等基础设施的运维、安全和高可用性等方面的工作,这带来了两个主要问题:

  • 开销巨大:这包括了人力成本的开销和机房建设的开销。企业需要配备专门的技术团队进行基础设施的管理和维护,同时还需要投入大量的资源进行机房建设和设备采购。
  • 资源浪费:面对流量冲击,例如秒杀等促销活动,企业必须提前规划并准备大量的服务器资源。然而,在活动结束后,这些服务器可能会处于闲置状态,导致资源的严重浪费。

为了解决这些问题,随着虚拟化技术和云原生技术的不断成熟,云服务商开始提供Serverless无服务器化的架构。这种架构使得企业无需进行服务器的任何配置和部署,完全由云服务商负责提供和管理基础设施。Serverless架构能够根据应用程序的实际需求动态地分配资源,确保应用程序的高可用性和弹性扩展。

在Serverless架构中,企业可以将应用程序部署到云服务商提供的平台上,并利用云服务商提供的API和事件驱动的机制来编写业务逻辑。这样,企业可以专注于应用程序的开发和业务逻辑的实现,而无需关心基础设施的管理和维护。比较典型的Serverless服务提供商包括亚马逊AWS和阿里云等。这些云服务商提供了丰富的Serverless服务,如函数计算、数据库、存储和消息队列等,使得企业可以更加便捷地构建和部署Serverless应用程序。通过采用Serverless架构,企业可以降低开销、减少资源浪费,并实现应用程序的高可用性和弹性扩展。同时,与GraalVM的结合使用可以进一步提高应用程序的性能和安全性,为企业提供更加高效和可靠的解决方案。

3.Serverless架构-函数计算

在Serverless架构中,函数计算是一种常见的服务模式,它将应用程序拆分为多个独立的函数,每个函数都以事件驱动的方式运行。这种模式的核心思想是将应用程序的逻辑分解为一系列独立的、可复用的函数,从而提高了应用程序的可维护性和可扩展性。函数计算的服务提供商包括亚马逊AWS的Lambda和阿里云的FC等。这些服务提供商提供了全面的函数计算解决方案,使开发人员能够专注于编写和部署函数逻辑,而无需关心底层基础设施的管理和维护。

函数计算的主要应用场景包括:

  • 小程序和API服务中的接口:对于调用频率较低的接口,使用常规的服务器架构可能会导致资源浪费。通过使用Serverless架构,开发人员可以实现按需付费,降低成本,同时利用自动伸缩功能应对流量的突发情况。
  • 大规模任务处理:对于需要处理大量数据或执行复杂计算的任务,例如音视频文件转码、审核等,可以利用事件机制在文件上传后自动触发相应的任务。函数计算可以提供高效的资源利用和弹性扩展能力,以满足大规模任务处理的需求。

在计费方面,函数计算通常基于CPU和内存使用量进行计费。因此,使用GraalVM AOT模式编译本地镜像可以进一步降低成本。通过使用GraalVM AOT编译器,开发人员可以生成高效的本地镜像,从而减少运行函数所需的CPU和内存资源,进而降低函数计算的计费成本。

4.Serverless架构-Serverless应用

在Serverless架构中,除了函数计算服务外,云服务商还提供了基于容器的Serverless应用作为另一种解决方案。这种方案针对函数计算服务的局限性,为需要更长时间运行或更大资源需求的应用程序提供了支持。

基于容器的Serverless应用的核心优势在于其自动化的容器管理。与传统的手动配置Kubernetes中的Pod和Service等内容不同,基于容器的Serverless应用简化了这一过程。开发人员只需选择所需的镜像,云服务商即可自动生成应用服务,无需进行繁琐的配置和管理。这种方案适用于各种应用场景,特别是需要长时间运行或大量资源支持的应用。例如,一些批处理任务、大数据处理和分析、实时流数据处理等场景,都可以通过基于容器的Serverless应用实现高效的处理和扩展。

在计费方面,基于容器的Serverless应用通常也基于CPU和内存使用量进行计费。因此,使用GraalVM AOT模式编译本地镜像可以进一步降低成本。通过使用GraalVM AOT编译器,开发人员可以生成高效的本地镜像,从而减少运行应用所需的CPU和内存资源,进而降低基于容器的Serverless应用的计费成本。

四、参数优化和故障诊断

在GraalVM中,由于它是一款独立的JDK,许多在HotSpot虚拟机中常用的参数在这里并不适用。为了确保最佳的性能和稳定性,需要对GraalVM的参数进行细致的调整和优化。以下是一些关键的参数和故障诊断建议:

内存管理参数:

  • 最大堆大小(Max Heap Size): 社区版GraalVM默认使用串行垃圾回收器(Serial GC),其最大Java堆大小默认设置为物理内存的80%。如需调整,可以使用-Xmx参数来设置最大堆大小。如果希望在编译期就指定该大小,可以在编译时添加-R:MaxHeapSize=最大堆大小参数。
  • G1垃圾回收器: 企业版GraalVM提供了G1垃圾回收器,它能有效降低垃圾回收的延迟。开启方式为添加--gc=G1参数。
  • Epsilon GC: 对于生命周期短暂且不产生大量对象的程序,可以考虑使用Epsilon GC。它不会产生任何垃圾回收行为,从而没有额外的内存和CPU开销。开启方式为添加--gc=epsilon参数。

垃圾回收日志与诊断:

  • 使用-XX:+PrintGC-XX:+VerboseGC参数可以打印出垃圾回收的详细信息,这对于故障诊断和性能调优非常有帮助。

性能优化时可以指定的一小部分选项:

-H:G1HeapRegionSize(只能在映像构建时指定) - G1 区域的大小。
-XX:MaxRAMPercentage- 如果未另行指定最大堆大小,则用作最大堆大小的物理内存大小的百分比。
-XX:MaxGCPauseMillis- 最长暂停时间的目标。
-XX:ParallelGCThreads- 在垃圾回收暂停期间用于并行工作的最大线程数。
-XX:ConcGCThreads- 用于并发工作的最大线程数。
-XX:InitiatingHeapOccupancyPercent- 触发标记周期的 Java 堆占用阈值。
-XX:G1HeapWastePercent- 候选集合集中允许的未回收空间。如果候选收集组中的可用空间低于该值,则 G1 将停止空间回收阶段。

其他常用的参数参考:

Memory Management (graalvm.org)icon-default.png?t=N7T8https://www.graalvm.org/22.3/reference-manual/native-image/optimizations-and-performance/MemoryManagement/


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了GraalVM、GraalVM的两种运行模式、GraalVM应用场景、参数优化和故障诊断等内容,希望对大家有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix配置自动发现

1.准备一台新的主机,安装相关软件包。 [rootsishi ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm [rootsishi ~]# yum -y install zabbix-agent2.修改zabbix-agent端的配置文件 [rootsishi ~]# vim /etc/z…

TS项目实战二:网页计算器

使用ts实现网页计算器工具,实现计算器相关功能,使用tsify进行项目编译,引入Browserify实现web界面中直接使用模块加载服务。   源码下载:点击下载 讲解视频 TS实战项目四:计算器项目创建 TS实战项目五:B…

当AGI遇到人形机器人

为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人,它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的,例如门、楼梯、桌椅、开关等…

【数据分享】1929-2023年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 之前我们分享过1929-2023年全球气象站点的逐月平均气温数据、逐月最高气温数据…

【征稿已开启】第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024) 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 第五届大数据、人工智能与软件工程国际研讨会&…

年假作业4

AACBB DACBDD DACBC DBDCA ADBAD #include <stdio.h> #include <string.h> int main(int argc, const char *argv[]) { int i,j; int temp; int arr[10]; for( i0;i<10;i) { printf("请输入第%d个数",i1); …

【lvgl】esp32移植lvgl

文章目录 一、环境二、抓取代码三、切换分支四、配置芯片信息五、编译异常问题1: 未定义宽高问题2: 修改接口问题3: lv_mem_size问题4&#xff1a;头文件命名打开配置问题5&#xff1a;缺少font12 六、配置引脚问题6&#xff1a;显示花屏&#xff0c;字符不清 七、测试demo八、…

vscode连接ssh报错

关于vscode更新版本至1.86后&#xff0c;导致无法连接服务器问题的记录 原因&#xff1a;vscode1.86更新了对glibc的要求&#xff0c;需要最低2.28版本&#xff0c;导致各种旧版本的linux发行版&#xff08;比如最常见的centos 7&#xff09;都无法用remote-ssh来连接了&#…

Windows11安装运行Linux(Ubuntu)

一、安装windows支持 输入windows打开界面 选择虚拟机监控程序平台、适用于linux的子系统、虚拟机平台 在 Windows 系统中&#xff0c;"虚拟机平台"和"虚拟机监控程序平台"是两个与虚拟化相关的功能&#xff0c;但它们各自有着不同的作用和用途。 虚拟机…

【ArcGIS微课1000例】0101:删除冗余节点或折点

文章目录 一、实验描述二、实验数据三、实验过程1. 手动删除2. 简化线工具四、注意事项一、实验描述 矢量数据获取通常来源于手动或者ArcScan自动采集,其基本存储方式就是记录每个要素的点坐标,如点要素就是一个坐标、线要素由多个点要素连接形成。当某段线要素被过多的节点…

thinkphp数据批量提交(群发消息)

<form id="edit-form" class="form-horizontal" role="form" data-toggle<

LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

文章目录 前言LeetCode、1137. 第 N 个泰波那契数【简单&#xff0c;动态规划】题目与分类思路一维动态规划 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术…

2024/2/5总结

微信小程序 监听对象中所有属性的变化 如果某个对象中需要被监听的属性太多&#xff0c;为了方便&#xff0c;可以使用 通配符 ** 来监听 对象中所有属性的变化 什么是纯数字字段 概念&#xff1a;纯数字字段指的是那些不用于界面渲染的 data 字段。 好处&#xff1a;提升界面…

敏捷开发中的用户故事

用户故事 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#xff0c…

transformers重要组件(模型与分词器)

1、模型&#xff1a; from transformers import AutoModelcheckpoint "distilbert-base-uncased-finetuned-sst-2-english" model AutoModel.from_pretrained(checkpoint) 除了像之前使用 AutoModel 根据 checkpoint 自动加载模型以外&#xff0c;我们也可以直接…

如何利用边缘计算网关进行机床数据采集,以提高数据采集的效率和准确性-天拓四方

边缘计算网关集成了数据采集、处理和传输功能的嵌入式设备。它位于传感器和执行器组成的设备层与云计算平台之间&#xff0c;能够实时处理和响应本地设备的数据请求&#xff0c;减轻云平台的压力&#xff0c;提高数据处理的速度和效率。同时&#xff0c;边缘计算网关还可以将处…

跟着cherno手搓游戏引擎【21】shaderLibrary(shader管理类)

前置&#xff1a; ytpch.h&#xff1a; #pragma once #include<iostream> #include<memory> #include<utility> #include<algorithm> #include<functional> #include<string> #include<vector> #include<unordered_map> #in…

ROS笔记一:工作空间和功能包

目录 工作空间 如何创建工作空间&#xff1a; 编译工作空间 设置环境变量 功能包 创建功能包 CMakeLists.txt package.xml 工作空间 ROS的工作空间是用来存放工程文件代码的文件夹 ROS的开发依赖于工作空间&#xff0c;包括编写代码、编译等都是在工作空间下进行的 工作空…

如何在Termux中使用Hexo结合内网穿透工具实现远程访问本地博客站点

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

GO语言集成开发 JetBrains GoLand 2023 中文

JetBrains GoLand 2023是一款专为Go语言开发者打造的集成开发环境&#xff08;IDE&#xff09;。它基于IntelliJ IDEA平台&#xff0c;提供了丰富的功能和工具&#xff0c;旨在提高开发效率和质量。GoLand 2023具备强大的Go语言支持&#xff0c;包括语法高亮、自动补全、代码提…