当前位置:首页 > 文章列表 > 文章 > java教程 > GraalVM 本机映像中的内存管理

GraalVM 本机映像中的内存管理

来源:dev.to 2024-09-04 15:27:58 0浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《GraalVM 本机映像中的内存管理》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

内存管理是计算机软件开发的重要组成部分,负责应用程序中内存的有效分配、利用和释放。其重要性在于增强软件性能,保证系统稳定性。

垃圾收集

垃圾收集 (gc) 在 java 和 go 等当代编程语言中至关重要。它自动检测并回收未使用的内存,从而减轻开发人员手动管理内存的需要。 gc 的概念最初出现在 20 世纪 50 年代末的 lisp 编程语言中,标志着自动内存管理的引入。

自动化内存管理的主要优势包括:

  • 防止内存泄漏,高效内存利用。
  • 简化开发流程,增强程序稳定性。

了解内存中“垃圾”的本质并识别可回收空间至关重要。在接下来的章节中,我们将从探索垃圾收集的基本原理开始。

引用计数算法 [george e. collins 1966]

引用计数算法在对象的标头中分配一个字段来跟踪其引用计数。此计数随着每个新引用而增加,并在删除引用时减少。当计数达到零时,该对象就有资格进行垃圾回收。

考虑以下代码:

首先创建一个带有值 demo 的字符串,由 d 引用(图 1)。

string d = new string("demo");

GraalVM 本机映像中的内存管理

图 1 – 创建字符串后

然后,将 d 设置为 null。 demo的引用计数为零。在引用计数算法中,需要回收demo的内存(图2)。

d =null; // reference count of 'demo' becomes zero, prompting garbage collection.

GraalVM 本机映像中的内存管理

图 2 – 当引用无效时

引用计数算法在程序执行期间运行,避免 stop-the-world 事件,这些事件会暂时停止程序以进行垃圾回收。然而,它的主要缺点是无法处理循环引用(图 3)。

例如:

public class CircularReferenceDemo {

  public CircularReferenceDemo reference;
  private String name;

  public CircularReferenceDemo(String name) {
    this.name = name;
  }

  public void setReference(CircularReferenceDemo ref) {
    this.reference = ref;
  }

  public static void main(String[] args) {
    CircularReferenceDemo objA = new CircularReferenceDemo("Ref_A");
    CircularReferenceDemo objB = new CircularReferenceDemo("Ref_B");

    objA.setReference(objB);
    objB.setReference(objA);

    objA = null;
    objB = null;
  }
}

这里,尽管使外部引用无效,但 obja 和 objb 之间的相互引用阻止了它们的垃圾回收。

GraalVM 本机映像中的内存管理

图 3 – 循环引用

我们可以看到这两个对象都无法再访问。然而,它们是互相引用的,因此它们的引用计数永远不会为零。因此,gc 收集器永远不会被通知使用引用计数算法对它们进行垃圾收集。

该算法实际上是通过使用 std::shared_ptr 在 c++ 中实现的。 std::shared_ptr 旨在管理动态分配对象的生命周期,在创建或销毁指向对象的指针时自动增加和减少引用计数。该智能指针是 c++ 标准库的一部分,提供强大的内存管理功能,可显着降低与手动内存处理相关的风险。每当复制 std::shared_ptr 时,托管对象的内部引用计数就会增加,反映新的引用。相反,当 std::shared_ptr 被破坏、超出范围或重新分配给不同的对象时,引用计数就会减少。当引用计数为零时,分配的内存会自动回收,并且对象会被销毁,
通过确保没有必要时不会保留分配的对象,有效防止内存泄漏。

可达性分析算法[1978]

可达性分析算法从gc根开始,遍历对象图。无法从这些根到达的对象被视为不可恢复,并成为收集的目标。

如下图所示,蓝色圆圈内的对象应该保持存活,灰色圆圈内的对象可以回收(图4)。

GraalVM 本机映像中的内存管理

图 4 – 内存泄漏

该方法有效解决了引用计数算法固有的循环引用问题。从 gc 根无法到达的对象将被分类以进行收集。

通常,被视为 gc 根的 java 对象包括:

  • 当前方法范围内的局部变量。
  • 活动 java 线程。
  • 类中的静态字段。
  • 来自本机代码的 jni 引用。

graalvm 原生镜像概述

graalvm 提供了一个提前 (aot) 编译器,它将 java 应用程序转换为独立的可执行二进制文件,称为 graalvm native images。这些二进制文件由 oracle 实验室开发
封装应用程序和库类以及 gc 等运行时组件,允许在没有 java 运行时环境 (jre) 的情况下进行操作。

该过程涉及静态分析以确定可访问的组件、通过执行块进行初始化,以及通过创建应用程序状态快照以供后续机器代码翻译来完成。

substrate vm 的基础知识

substrate vm 是 graalvm 套件的一个组成部分,由 oracle 实验室精心策划。它是一个增强的 jvm,不仅支持提前 (aot) 编译,还有助于执行 java 以外的语言,例如 javascript、python、ruby,甚至是 c 和 c++ 等本机语言。 substrate vm 的核心是一个复杂的框架,允许 graalvm 将 java 应用程序编译成独立的本机二进制文件。这些二进制文件不依赖于传统的 java 虚拟机 (jvm) 来执行,这简化了部署并
操作流程。

substrate vm 的主要功能之一是其专门的垃圾收集器,它针对需要低延迟和最小内存占用的应用程序进行了微调。该垃圾收集器擅长处理与本机映像不同的独特内存布局和操作模型,这与在标准 jvm 上运行的传统 java 应用程序有很大不同。 substrate vm 本机映像中缺少即时 (jit) 编译器是一种战略选择,有助于最小化可执行文件的总体大小。这是因为它消除了包含 jit 编译器和相关元数据的必要性,这些元数据的大小和复杂性都很大。

此外,虽然 graalvm 是使用 java 开发的,但这会带来一定的限制,特别是在本机内存访问方面。此类限制主要是出于安全考虑以及保持跨平台兼容性的需要。然而,访问本机内存对于优化垃圾收集操作至关重要。为了解决这个问题,substrate vm 采用了一套专门的接口来促进与本机内存的安全高效的交互。这些接口是更广泛的 graalvm 架构的一部分,使 substrate vm 能够以类似于 c 等较低级语言的方式有效管理内存,同时保留 java 的安全性和可管理性。

在实践中,这些功能使 substrate vm 成为一种极其通用的工具,可以增强使用 graalvm 编译的应用程序的功能和效率。通过允许开发人员
substrate vm 利用更广泛的编程语言并将它们编译成高效的本机二进制文件,突破了传统 java 开发环境所能实现的界限。这使其成为需要高性能、减少资源消耗和多种语言支持的现代软件开发项目的宝贵资产。

substrate vm 值得注意的元素包括:

  • 通过用于原始内存操作的指针接口 pointer 和用于处理字大小值的 wordbase 接口 wordbase 等接口简化内存访问。

  • 将堆划分为包含不可变对象的预初始化段和用于动态对象分配的运行时段(图 5)。

GraalVM 本机映像中的内存管理

图 5 – 本机映像中的内存管理

在运行时,substrate vm 中所谓的镜像堆包含在镜像构建过程中创建的对象。堆的这一部分是用可执行二进制文件的数据部分中的数据预先初始化的,并且可以在应用程序启动时轻松访问。驻留在图像堆中的对象被认为是不朽的;因此,这些对象中的引用被
视为根指针 垃圾收集器。但是,gc 仅扫描部分映像堆中的根指针,特别是那些未标记为只读的指针。

在构建过程中,指定为只读的对象被放置在图像堆的特定只读部分中。由于这些对象永远不会保存对运行时分配的对象的引用,因此它们不包含根指针,从而允许 gc 在扫描期间绕过它们。同样,仅由原始数据或原始类型数组组成的对象也缺少根指针。此属性进一步简化了垃圾收集过程,因为这些对象可以从 gc 扫描中省略。

相比之下,java 堆被指定用于保存在运行时动态创建的普通对象。堆的这一部分会定期进行垃圾收集,以回收不再使用的对象占用的空间。它被构造为具有老化机制的分代堆,随着时间的推移促进高效的内存管理。

预初始化、永久映像堆和动态管理的 java 堆之间的这种划分使 substrate vm 能够优化内存使用和垃圾收集效率,满足应用程序内存需求的静态和动态方面。

堆块

在 substrate vm 的堆模型中,内存被系统地组织成称为堆块的结构。这些块的默认大小通常为 1024kb,形成一个连续的虚拟内存段,仅分配给对象存储。这些块的组织结构是一个链表,其中尾部块代表最近添加的段。这样的模特
促进高效的内存分配和对象管理。

这些堆块进一步分为两种类型:对齐和未对齐。对齐的堆块能够连续保存多个对象。这种对齐方式可以更简单地映射
对象到各自的父堆块,使内存管理更加直观和高效。在需要对象提升的场景中 - 通常是在垃圾收集期间和
内存优化——对象从其在父堆块中的原始位置移动到位于指定的“旧目标空间”中的目标堆块。此迁移是分代堆管理策略的一部分,该策略通过将年轻对象与旧对象分离来帮助优化垃圾收集过程,从而减少 gc 周期期间的开销。

本机映像中的垃圾收集器

graalvm native image 支持针对不同需求定制的各种 gc:

  • 串行gc:默认的低占用空间收集器,适合单线程应用程序。

  • g1 垃圾收集器: 专为具有大堆大小的多线程应用程序而设计,增强了生成管理的灵活性。

  • epsilon gc: 一种简约的收集器,处理分配但缺乏回收,最适用于可预测堆完全利用率的短期应用程序。

结论

总之,substrate vm 通过结合专门的垃圾收集和结构化堆管理等先进技术,有效地优化了 graalvm 中的内存管理。这些功能(包括堆块以及用于图像和 java 堆的单独内存段)可简化垃圾收集并提高应用程序性能。由于 substrate vm 支持多种编程语言并将其编译为高效的本机二进制文件,因此它展示了现代 jvm 框架如何超越传统边界,以提高不同应用程序环境中的执行效率和鲁棒性。这种方法为虚拟机技术和应用程序部署的未来发展设定了高标准。

今天关于《GraalVM 本机映像中的内存管理》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
win10双网卡上网互不干扰怎么设置 win10双网卡上网互不干扰怎么设置
上一篇
win10双网卡上网互不干扰怎么设置
win10电脑检测不到电池怎么办 win10笔记本未检测到电池解决方法
下一篇
win10电脑检测不到电池怎么办 win10笔记本未检测到电池解决方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    151次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    144次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    158次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    154次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    161次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码