JVM的垃圾回收机制及其工作原理

Java 虚拟机(JVM)的垃圾回收机制(GC)旨在自动管理应用程序申请的内存。当对象不再被使用时,GC会自动释放它们所占据的堆内存,防止内存泄漏。

JVM内存区域:

在了解垃圾回收之前,要知道JVM的以下内存区域:

  • 堆(Heap):这是JVM的主要内存区域,所有的Java对象以及与之关联的数组都在堆内存中分配。
  • 方法区(Method Area)/永久代(PermGen)/元空间(Metaspace):用于存储已被虚拟机加载的类信息、常量、静态变量等。

GC工作原理:

垃圾回收主要基于两个基本假设:

  1. 分代假设:大部分对象很快无用,少部分长期存活。
  2. 可达性分析:分析对象的引用链,如果从根集合(GC Roots,如线程栈、静态引用等)开始的遍历无法到达某个对象,则认为该对象不可达,可以被回收。

基于这些假设,Java 内存被分为几个代:

  • 新生代(Young Generation):几乎所有新创建的对象首先都是在新生代分配。此区域经常进行GC称为Minor GC。
  • 老年代(Old Generation)/永久代:较老的对象(如果它们从新生代存活下来)会被移动到老年代。此区域GC不太频繁,当执行时称为Major GC或Full GC。

GC算法:

GC 使用不同的算法,主要有以下几种:

  • 标记-清除(Mark-Sweep):首先标记所有从GC Roots可达的对象,在完成标记后统一回收所有未被标记的对象。
  • 复制(Copying):把当前内存分为两块,每次只用其中一块。当这一块内存用尽,就复制存活对象到另一块空的内存区,然后整个清理已使用的内存区。
  • 标记-整理(Mark-Compact):用于老年代,标记过程与标记-清除算法相同,但是后续会移动所有存活的对象,让它们在内存中连续排列,然后直接清理边界以外的内存。
  • 增量(Incremental):将垃圾回收划分为多个小部分,分步进行,减少每次垃圾回收的时间,使系统响应更加及时。

垃圾收集器:

不同的垃圾收集器实现了这些算法的不同组合和变种,JVM使用的垃圾收集器包括:

  • 串行收集器:简单但在回收时会暂停所有应用线程。
  • 并行收集器:多线程进行,适合多CPU环境。
  • 并发标记清除(CMS)收集器:减少回收时的停顿,但可能会导致更多的CPU资源消耗。
  • G1收集器:将堆内存划分为多个区域,通过逐渐地清理这些区域来避免整个堆的长时间回收停顿。
  • ZGC和Shenandoah:最新的实验性收集器,目标是几乎消除所有GC导致的暂停。

垃圾回收是自动进行的,开发者不能明确地触发它。然而,可以通过调用 System.gc() 来建议虚拟机执行垃圾回收,但JVM并不保证立即或者首先执行垃圾收集。

继续讨论垃圾回收,还有一些重点值得注意:

GC Roots包括:

  • 在虚拟机栈(局部变量表)中引用的对象。
  • 在方法区中类静态属性引用的对象。
  • 在方法区中常量引用的对象。
  • 在本地方法栈中 JNI(Native 方法)引用的对象。

Java中如何判断对象不可达:

  • 主要方式是通过可达性分析,即从一系列的称之为 GC Roots 的对象开始,遍历这些对象的引用,如果一个对象到 GC Roots 没有任何引用链,即认为此对象不可达。
  • 另外,Java 还提供了一些方法来判断对象可回收性,例如 finalize() 方法,但已被视为过时,因为它的不可预测性和性能问题。

垃圾回收的开销:

  • GC的执行通常伴随着停顿时间(Stop-The-World),这是因为Minor GC或Full GC在进行时,需要暂停应用程序的运行,这对实时系统可能会造成问题。
  • JVM提供了许多用于配置垃圾收集的参数,这些参数可以帮助调优GC以优化应用程序性能。

实现最佳的垃圾回收策略需要平衡各种因素,包括可用内存、应用程序的停顿时间要求、垃圾生成速率等。开发人员通常需要根据应用程序的具体情况监控和调优GC性能,JVM也提供了许多工具,如jVisualVM、jConsole、GC日志等,以帮助收集GC的性能数据和进行分析。

最后,正确的编程习惯也很重要,比如及时清除不再需要的对象引用、不滥用finalize方法、以及合理使用数据结构等都能减轻GC的负担,从而提升整体的应用性能。

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

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

相关文章

LeetCode算法题:49. 字母异位词分组(Java)

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …

答辩PPT自述稿如何准备?笔灵AI答辩PPT,自动生成演讲稿

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路,一窍不通。但这并不是你们的错,对于平时没接触过相关方面,第一次搞答辩PPT的人来说,这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

试试这四个AI论文工具和降重技术,低成本高回报

在科研领域,AI写作工具如同新一代的科研利器,它们能够极大提高文献查阅、思路整理和表达优化的效率,本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息,还帮助我们精确提炼中心思想,显著提升论文写作…

springBoot实现发送邮箱验证码 redis缓存源码

要在Spring Boot中实现发送邮箱验证码并使用Redis进行缓存,你需要遵循几个步骤。以下是一个简化的示例,展示了如何整合这些功能: 添加依赖 首先,确保你的pom.xml(Maven)或build.gradle(Gradle…

研发管理-选择研发管理系统-研发管理系统哪个好

选择研发管理系统-研发管理系统哪个好 选择研发管理系统时,并没有一个绝对的“最好”的系统,因为每个企业的需求和情况都是独特的。然而,我可以向您介绍一些在市场上广受欢迎且功能强大的研发管理系统,供您参考: 1、彩…

MathType7.9中文官方最新破解汉化版无需许可证激活码

MathType是一个功能强大的数学公式编辑器,它能够帮助用户轻松地创建、编辑和排版各种数学公式。无论是学生、教师还是科研人员,都可以从MathType的丰富功能中受益。本文将为您详细介绍MathType的主要功能和使用方法,帮助您更好地利用这个工具…

web网页录音(recorder.js)并上传后端语音转文字(Vosk)

我是一个后端开发人员,现在都快进化成全栈了。操了,是谁有好的项目让我跳跳槽,转转行吧 写在前面,很重要 这是官方文档的说明 翻译如下: 我们有两种型号-大型号和小型号,小型号非常适合在移动应用程序上执…

远程服务器AutoDL登录/配环境/部署运行大模型方法

1. AutoDL autodl平台,是一个功能强大的本地大语言模型LLM运行专家,为用户提供了简单高效的方式来运行大型语言模型.通过优化设置和配置细节。 地址:AutoDL官方地址 2. 登录远程服务器方式 登录远程服务器的方式和工具有很多种 2.1 方法一 用AutoDL…

Android 编译文件简述(CMakeLists.txt)

Android 编译文件简述(CMakeLists.txt) CMakeLists.txt 是 CMake (Cross Platform Make)构建系统中用于配置项目的核心文件。它采用 CMake 自定义的语法,用于指定项目的组织结构、编译选项、依赖项等信息。通过编写 CMakeLists.txt 文件,可以实现跨平台的项目构建和管理。…

应用层(上篇)

应用层 应用层协议原理 网络应用程序体系解构 应用程序体系结构: 由应用程序研发者设计规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等…

24.5.12(23广东,19陕西)(字典树)

星期一: dp题单 区间dp第三题 二叉搜索树 cf传送门 思路:dp【i】【j】【0/1】表示区间 i到 j,以 i / j为根节点能否形成一棵二叉搜索树 因为题目要求组成二叉搜索树,若 i 到 j 的节点为一颗完整的子…

等保2.0的全面解读与实施策略

《网络安全等级保护基本要求》(等保2.0)是中华人民共和国国家安全部于2019年6月发布的网络安全等级保护标准。该标准规定了我国关键信息基础设施的网络安全等级保护要求和评估标准,对于保障我国网络安全具有重要的意义。下面是对等保2.0的全面…

Scratch四级:第09讲 搜索算法

第09讲 搜索算法 教练:老马的程序人生 微信:ProgrammingAssistant 博客:https://lsgogroup.blog.csdn.net/ 讲课目录 常考的搜索算法项目制作:“小猫钓鱼”项目制作:“统计身高”项目制作:“找出出现次数最多的数字”搜索算法 搜索算法常用于列表的题目中,包括: (1)…

LabVIEW开发RS422通信

LabVIEW开发RS422通信 项目围绕LabVIEW软件开发的程序在RS422通信技术检测方面的应用进行展开,通过软件编程将上位计算机虚拟化为检测设备,控制其通信端口与被测产品进行RS422通信,以此检验产品的性能优劣。该虚拟检测仪器在实际测试中表现出…

c++红黑树的模拟实现

目录 1. 红黑树的概念 ​编辑 2. 红黑树的性质 3. 红黑树的模拟实现 3.1 红黑树节点的定义 3.2 红黑树的插入 旋转代码 插入主逻辑代码 验证是否平衡 4. 红黑树与AVL树的比较 1. 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一…

嵌入式中STM32上模拟启动Linux自动初始化

Linux中有很多编程思想可以学习,很多大佬把这些思想、机制运用到单片机的编程上。 下文,在STM32上模拟Linux kernel自动初始化流程。 通常我们写程序都是按照这个套路,一个函数一个函数按照顺序逻辑一个一个的执行下去。 如果逻辑非常复杂,涉及的模块比较多,那么这种顺…

Quests system for Unity

一个简单而灵活的任务系统将帮助你实现所有的想法,而不需要事件和逻辑中的一堆额外代码! 我的资产是一个用于执行任务的独立系统。 特征: 任务逻辑不需要继承MonoBehaviour。 在一行中完成所需任务的激活/进度/完成。 易于理解的界面,包含项目中所有任务的列表。 不需要连接…

人才培养计划大纲

构建全面而高效的人才培养规划 文章大纲: 引言 人才培养的重要性当前人才培养面临的挑战文章目的与结构人才培养规划的基本概念 定义与内涵人才培养规划与企业战略的关系人才培养规划的基本原则人才培养规划的现状分析 当前人才培养规划的实践情况存在的问题与不足…

解锁!智能代码助手 Baidu Comate 硬核能力

近日,在全球软件开发大会上暨智能软件开发生态展上,来自 Baidu Comate 的资深研发工程师分享了精彩的专题演讲,小编整理了演讲精华,和大家一起玩转“大模型软件研发”。 今天带来——吴玮琦《智能代码助手 Baidu Comate 的核心能…

【Python时序预测系列】灰狼算法(GWO)优化LSTM实现单变量时间序列预测(案例+源码)

这是我的第279篇原创文章。 一、引言 灰狼算法(GWO)是一种新型的优化算法,灵感来源于灰狼群体中的社会行为。在灰狼算法中,每只灰狼都有自己的位置和适应度值,通过模拟灰狼群体的行为来搜索最优解。将灰狼算法应用于优…