JVM 运行时数据区和垃圾收集算法

在 《深入理解 Java 虚拟机》一书中,作者将运行时数据区和垃圾收集算法放在开头章节,说明了这两个知识点是进一步学习 JVM 的基础知识点,相比后续的 垃圾收集器和 JMM,它也更加的简单。

运行时数据区

运行时数据区是《Java 虚拟机规范》规定的,Java 虚拟机在运行 Java 程序的过程中划分的数据区域。分为程序计数器、虚拟机栈、本地方法栈、方法区和堆共五个区域。可以从三个方面来总结这些区域,即区域是用来存储什么数据的?区域是线程共享的还是私有的?区域会抛出哪些异常。

  1. 程序计数器

    • 存储线程执行字节码的行号
    • 线程私有
  2. 虚拟机栈

    • 存储 Java 程序普通方法的调用栈
    • 线程私有
    • 可能抛出 StackOverFlowError 和 OutOfMemoryError
  3. 本地方法栈

    • 存储 Java 程序 native 方法的调用栈
    • 线程私有
    • 可能抛出 StackOverFlowError 和 OutOfMemoryError
  4. 方法区

    • 存储加载的类型信息、运行时常量池
    • 线程共享
    • 可能抛出 OutOfMemoryError
    • Java 虚拟机管理的最大的一块内存,用来存储对象实例
    • 线程共享
    • 可能抛出 OutOfMemoryError

垃圾收集算法

Java 语言和 C/C# 语言最大的区别就是 Java 语言会自动分配和回收内存,内存的分配暂且不聊,内存回收是由 JVM 中的垃圾收集器来提供支持的。在 JVM 中,内存分配的基本单位是对象,所以内存回收也是以对象为单位来回收的。

开发人员在设计垃圾收集器时,为了简化问题,将垃圾收集的过程分成了两步:

  1. 标记哪些对象需要回收;
  2. 怎么回收这些对象。

标记内存中哪些对象需要回收的算法有两种,分别是引用计数器法和可达性分析法。

引用计数器法

引用计数器法指的是在每个对象中维护一个计数器,当有一个地方引用它时计数器就加一,当一个引用失效时计数器就减一,当计数器为 0 的时候判定对象是垃圾内存,需要回收。

引用计数器法需要解决循环引用的问题,即两个对象互相引用,其他再没有地方引用它们,这时它们应该算是需要被回收对象才对,但是它们的引用计数器却不是 0。

可达性分析法

可达性分析法指通过一系列被称为 “GC Roots” 的根对象作为起始节点集,从这些节点开始根据引用关系向下搜索,在搜索过程中能够遍历到的对象就是存活的对象,没有遍历到的对象就是垃圾对象,需要回收。

值得注意的是,所有的垃圾收集器使用的判断对象是否可回收的算法都是可达性分析法。因为可达性分析法没有循环引用的问题,而要解决引用计数器法的循环引用问题,带来的复杂性和性能消耗可能会得不偿失。

标记-清理算法

确定了哪些内存可以回收之后我们需要确定怎么回收,在 Java 虚拟机发展过程中出现过许多垃圾收集算法。

标记-清理算法正如它的名字一样,它分为标记和清理两个步骤,其中标记是使用前面介绍的可达性分析法将可回收对象标记出来,标记结束后,统一回收掉所有的被标记对象。

标记-清理算法会造成大量不连续的内存碎片,因为给对象分配内存需要连续的内存空间,如果空间碎片太多的话会出现当前总的内存可用空间大于需要分配的空间,但是连续的内存可用空间都小于需要分配的内存,从而导致 JVM 需要提前触发垃圾收集动作。

标记-复制算法

标记-复制算法将内存按容量划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了之后就将还存活的对象复制到另外一块内存中,然后把一块的内存一次清理掉。

因为每次垃圾收集之后都会将存活对象复制到另外一块内存区域,这里的复制和后续的新对象分配都是从内存区域的开头开始分配的,所以不会存在空间碎片的问题,但是这种算法的缺点也明显,只能使用可用内存空间的一半,空间浪费非常严重。

标记-整理算法

标记-整理算法的标记阶段和标记-清理算法一样,先标记出所有可回收对象,然后让所有存活对象向内存空间的一端移动,最后直接清理掉最后一个存活对象之后的所有内存空间,移动存活对象的时候就像整理一个个货物,所以它被称为标记-整理算法。

标记-整理算法看似比前两种算法都优秀,因为它既没有空间碎片的问题也没有空间浪费的问题,但是在整理过程中需要移动存活对象,移动之后需要更新所有引用这些对象的地方,这是一项非常中的操作。

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

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

相关文章

Centos7使用nginx搭建rtmp流媒体服务器

为什么写这篇文章 2023年10月份,公司系统中有个需求,需要使用摄像头记录工程师在维修设备时的工作状态,找到了一家做执法记录仪的厂商,通过厂商发过来的文档了解到该执法记录仪支持通过rtmp协议推流至服务器,第一次接…

【SQL】MySQL中的存储引擎、事务、锁、日志

存储引擎: 数据库管理系统(DBMS)使用数据存储引擎进行创建、查询、更新和删除数据。 MySQL5.5之前默认的存储引擎是MyISAM,5.5及之后版本默认的存储引擎是InnoDB。(my.ini中指定的) MyISAM:不支持事务,不支…

F. Vasilije Loves Number Theory

Problem - F - Codeforces 思路:分析一下题意,对于第一种操作来说,每次乘以x,那么nn*x,然后问是否存在一个a使得gcd(n,a)1并且n*a的约数个数等于n,有最大公约数等于1我们能够知道其实这两个数是互质的&…

『Linux项目自动化构建工具』make/Makefile

前言 如题可知,make/Makefile为在Linux下的项目自动化构建工具; 在上一篇文章『Linux - gcc / g』c程序翻译过程 中讲解了C/C程序的翻译过程; 而make/Makefile即可以看成,是Makefile在使用gcc/g使在Linux环境下能够更好的高效率的进行项目构建; 在此之前首先要对make/Makefile…

【PostgreSQL内核学习(十八)—— (数据库表参数)】

数据库表参数 default_reloptions 函数案例 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核…

【2023研电赛】安谋科技企业命题特别奖:面向独居老人的智能居家监护系统

本文为2023年第十八届中国研究生电子设计竞赛安谋科技企业命题特别奖分享,参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来领!,分享2023研电赛作品扩大影响力,更有丰富电子礼品等你来…

Meta Semantic Template for Evaluation of Large Language Models

本文是LLM系列文章,针对《Meta Semantic Template for Evaluation of Large Language Models》的翻译。 大型语言模型评估的元语义模板 摘要1 引言2 相关工作3 方法4 实验5 结论 摘要 大型语言模型(llm)是否真正理解语言的语义,或者只是记住训练数据?…

dart的Websocket为什么找不到onOpen方法?

我主要使用的是JAVA,而JAVA使用Websocket时,Websocket一定会有个onOpen方法。 ClientEndpoint public class WebsocketListener {OnOpenpublic void onOpen(Session session) throws IOException {}OnMessagepublic void onMessage(ByteBuffer byteBuff…

按关键字搜索淘宝商品API接口获取商品销量、优惠价、商品标题等参数示例

关键词搜索商品接口的作用是提供搜索功能,让用户根据关键词在电商平台上搜索商品,并根据搜索条件和偏好获取相关的商品列表和推荐结果,提高用户购物体验和准确度。对于电商平台而言,这个接口也能帮助用户发现更多商品、提升销量和…

PostgreSQL安装错误:Problem running post-install step

问题描述 安装包:pgpostgresql-14.9-1-windows-x64 postgresql-16.0-1-windows-x64 采取措施 一、 首先安装的是16版本的程序,报错后卸载尝试安装14版本软件,依旧报错。 二、 网上搜索,发现该博客: PostgreSQL安…

Springboot 接收POST、json、文本数据实践

一、接收 Form 表单数据 1,基本的接收方法 (1)下面样例 Controller 接收 form-data 格式的 POST 数据: import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.Request…

windows平台FairMOT的实现

环境:python3.6pytorch1.1.0torchvision0.3.0cuda9.2vs2015 该项目需要装3个c库(dcn_v2,apex,cython_bbox)特别坑,各种环境不匹配,各种bug。本人c小白,但是一路摸索总算成功了。下面…

数学术语之源——单射(injection),满射(surjection),双射(bijection)

1. 单射或入射(injection) 1.1 injection的词源 词义为“a forcing of a fluid into a body (with a syringe, etc.)(迫使液体进入体内(使用注射器等))”(始于15世纪早期),来自古法语“iniection ”(14世纪)或者直接来自拉词语“iniectionem (主格‘iniectio’)”&…

游戏软件开发与应用软件开发有什么不同呢?

游戏软件开发和应用软件开发是两种不同类型的软件开发,它们在许多方面都有不同之处。以下是它们之间的一些主要区别: 目标用户群体: 游戏软件开发的主要目标是提供娱乐和休闲体验,通常面向广大的游戏玩家群体。游戏软件的设计和开…

【嵌入式】常用串口协议与转换芯片详解

文章目录 0 前言1 一个通信的协议的组成2 常用协议名词解释2.1 UART2.2 RS-2322.3 RS-4852.4 RS-4222.5 比较 3 常用的芯片 0 前言 最近有点想研究USB协议,正好也看到有评论说对如何选择USB转串口模块有些疑惑,其实我也一直很想写一篇关于串口的总结式的…

修炼k8s+flink+hdfs+dlink(四:k8s(二)组件)

一:控制平面组件。 控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。 1. kube-apiserver。 该组件负责公开了 Kubernetes API&a…

浏览器详解(四) 渲染

大家好,我是半虹,这篇文章来讲浏览器渲染 1、基本介绍 浏览器是多进程多线程的架构,包括有浏览器进程、渲染器进程、GPU 进程、插件进程等 在上篇文章中我们介绍过浏览器进程,作为浏览器主进程,负责浏览器基本界面的…

天龙八部服务端Public目录功能讲解

PublicDataAIScript文件夹中 script(0~210).ai怪物AI脚本设定如是否主动攻击是否使用技能 PublicDataScript文件夹中 eventbossgroupbg_BossAI_CreateMonster.lua 是BOSS群 刷小怪通用脚本 PublicDataScript文件夹中 eventbossgroupbg_CangShan.lua 苍山 BOSS群刷新脚本 Public…

创建properties资源文件,并由spring组件类获取资源文件

1.1 创建资源文件file-upload-dev.properties #文件上传地址 file.imageUserFaceLocation=/workspaces/images/foodie/faces #图片访问地址 file.imageServerUrl=http://localhost:8088/foodie/faces1.2 创建spring组件获取资源文件类FileUpload import org.springframework.…

超低延时直播技术演进之路-进化篇

一、概述 网络基础设施升级、音视频传输技术迭代、WebRTC 开源等因素,驱动音视频服务时延逐渐降低,使超低延时直播技术成为炙手可热的研究方向。实时音视频业务在消费互联网领域蓬勃发展,并逐渐向产业互联网领域加速渗透。经历了行业第一轮的…