java虚拟机jvm垃圾收集基础(垃圾回收基础知识)

java 语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源,例如内存资源的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但是也增加了软件系统的负担。

拥有垃圾收集器可以说是 Java 语言与 C++语言的一项显著区别。在 C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后必须手工释放曾经占用的内存空间。当内存释放不够完全时,即存在分配但永不释放的内存块,就会引起内存泄漏,严重时甚至导致程序瘫痪。

以下列举了垃圾回收器常用的算法及实验原理:

  • 引用计数法 (Reference Counting)

引用计数器在微软的 COM 组件技术中、Adobe 的 ActionScript3 种都有使用。

引用计数器的实现很简单,对于一个对象 A,只要有任何一个对象引用了 A,则 A 的引用计数器就加 1,当引用失效时,引用计数器就减 1。只要对象 A 的引用计数器的值为 0,则对象 A 就不可能再被使用。

引用计数器的实现也非常简单,只需要为每个对象配置一个整形的计数器即可。但是引用计数器有一个严重的问题,即无法处理循环引用的情况。因此,在 Java 的垃圾回收器中没有使用这种算法。

一个简单的循环引用问题描述如下:有对象 A 和对象 B,对象 A 中含有对象 B 的引用,对象 B 中含有对象 A 的引用。此时,对象 A 和对象 B 的引用计数器都不为 0。但是在系统中却不存在任何第 3 个对象引用了 A 或 B。也就是说,A 和 B 是应该被回收的垃圾对象,但由于垃圾对象间相互引用,从而使垃圾回收器无法识别,引起内存泄漏。

  • 标记-清除算法 (Mark-Sweep)

标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段首先通过根节点,标记所有从根节点开始的较大对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。该算法最大的问题是存在大量的空间碎片,因为回收后的空间是不连续的。在对象的堆空间分配过程中,尤其是大对象的内存分配,不连续的内存空间的工作效率要低于连续的空间。

  • 复制算法 (Copying)

将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

如果系统中的垃圾对象很多,复制算法需要复制的存活对象数量并不会太大。因此在真正需要垃圾回收的时刻,复制算法的效率是很高的。又由于对象在垃圾回收过程中统一被复制到新的内存空间中,因此,可确保回收后的内存空间是没有碎片的。该算法的缺点是将系统内存折半。

Java 的新生代串行垃圾回收器中使用了复制算法的思想。新生代分为 eden 空间、from 空间、to 空间 3 个部分。其中 from 空间和 to 空间可以视为用于复制的两块大小相同、地位相等,且可进行角色互换的空间块。from 和 to 空间也称为 survivor 空间,即幸存者空间,用于存放未被回收的对象。

在垃圾回收时,eden 空间中的存活对象会被复制到未使用的 survivor 空间中 (假设是 to),正在使用的 survivor 空间 (假设是 from) 中的年轻对象也会被复制到 to 空间中 (大对象,或者老年对象会直接进入老年带,如果 to 空间已满,则对象也会直接进入老年代)。此时,eden 空间和 from 空间中的剩余对象就是垃圾对象,可以直接清空,to 空间则存放此次回收后的存活对象。这种改进的复制算法既保证了空间的连续性,又避免了大量的内存空间浪费。

  • 标记-压缩算法 (Mark-Compact)

复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在年轻代经常发生,但是在老年代更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活的对象较多,复制的成本也将很高。

标记-压缩算法是一种老年代的回收算法,它在标记-清除算法的基础上做了一些优化。也首先需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片的产生,又不需要两块相同的内存空间,因此,其性价比比较高。

  • 增量算法 (Incremental Collecting)

在垃圾回收过程中,应用软件将处于一种 CPU 消耗很高的状态。在这种 CPU 消耗很高的状态下,应用程序所有的线程都会挂起,暂停一切正常的工作,等待垃圾回收的完成。如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。

增量算法的基本思想是,如果一次性将所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。每次,垃圾收集线程只收集一小片区域的内存空间,接着切换到应用程序线程。依次反复,直到垃圾收集完成。使用这种方式,由于在垃圾回收过程中,间断性地还执行了应用程序代码,所以能减少系统的停顿时间。但是,因为线程切换和上下文转换的消耗,会使得垃圾回收的总体成本上升,造成系统吞吐量的下降。

  • 分代 (Generational Collecting)

根据垃圾回收对象的特性,不同阶段最优的方式是使用合适的算法用于本阶段的垃圾回收,分代算法即是基于这种思想,它将内存区间根据对象的特点分成几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率。以 Hot Spot 虚拟机为例,它将所有的新建对象都放入称为年轻代的内存区域,年轻代的特点是对象会很快回收,因此,在年轻代就选择效率较高的复制算法。当一个对象经过几次回收后依然存活,对象就会被放入称为老生代的内存空间。在老生代中,几乎所有的对象都是经过几次垃圾回收后依然得以幸存的。因此,可以认为这些对象在一段时期内,甚至在应用程序的整个生命周期中,将是常驻内存的。如果依然使用复制算法回收老生代,将需要复制大量对象。再加上老生代的回收性价比也要低于新生代,因此这种做法也是不可取的。根据分代的思想,可以对老年代的回收使用与新生代不同的标记-压缩算法,以提高垃圾回收效率。

 

 

欢迎各位同行朋友交流JVM核心算法和知识。


修改Avaya IP-Office电话交换机出厂自带的提示语音内容 1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话 阅读详情

相关推荐

JVM垃圾回收器介绍与调优技巧

Java虚拟机(JVM)是运行Java应用程序的核心组件之一,其作用是负责字节码的编译、加载、运行等任务。JVM是一个庞大的体系结构,包括一个类装载器、解释器、JIT(即时编译器)优化器、垃圾回收系统、安全管理器等模块。随着Java技术的不断发展,越来越多的开发人员开始关注JVM性能调优,如何在不影响程序执行效率的前提下,提升JVM的运行速度、降低内存占用、减少GC频率、最大限度提高吞吐量等方面,都成为了大家追求的目标。

AI天才研究院 954

JVM 垃圾回收器工作原理及使用实例介绍

此文系转载,详见:点击打开链接

Miner_Jasber_Yon的专栏 4万+

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 861

JVM常见的垃圾收集算法

垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,所以只介绍几种算法的思想及其发展过程。 JVM常见的GC算法有以下四种: 标记-清除算法(Mark-Sweep) 标记-整理算法(Mark-Compact) 复制算法(Copying) 分代算法(Generational) 一、标记-清除算法 算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的待回收对象。这种算法主要有两个缺点:第一个是效率问题,标记和清理两个过程效率都不高

周二Show 435

Java中的常见JVM垃圾收集算法

介绍几种常见的垃圾收集算法,比如复制算法、标记清除算法、标记压缩算法、综合其他算法的分代算法、G1的分区算法等。

终生学习践行者 3764

GC算法

GC是Java垃圾回收垃圾收集算法有如下几种:(1)、Mark-Sweep(标记-清除)算法  这是最基础垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。具体过程如下图所示:  从图中可以很容易看出标记-清除算法实现起来比较容易,但是有...

yufeiyanliu的专栏 744

快速掌握JVM垃圾回收

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。...

wenqi 914

3.Java面试题—JVM基础、【内存管理】、【垃圾回收】 & 垃圾收集器、JVM 调优

Java虚拟机(JVM是用来解析和运行Java程序的一种虚拟机。编译器将Java ⽂件编译成平台无关的Java 字节码文件 (.class),对应平台JVM将字节码文件翻译成机器指令并运⾏。垃圾回收时,会涉及对象的移动。为了保证对象引用的正确性,必须暂停所有线程,这样的停顿被称为。简称 STW。

页川叶川 1190

JVM面试题,求求你别再问我java虚拟机

简述什么叫JVM JVMJava Virtual Machine缩写。它是一种计算设备的规范,是一个虚拟的计算机,通过在实际的计算机上模拟各种计算机功能实现。有一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,使java程序只需要生成字节码就可以在多种平台上不加修改地运行。JVM在执行字节码时,还是要把字节码解释成具体平台上的机器指令...

你就像甜甜的益达 698

深入理解Java虚拟机JVM内存结构与垃圾回收机制详解

JVM的内存结构与垃圾回收机制是一个庞大而精密的系统。理解程序计数器、虚拟机栈、本地方法栈、堆、方法区等内存区域的作用与特性,是分析内存问题的基础。而掌握引用计数、可达性分析等存活判定算法,以及标记-清除、标记-复制、标记-整理等经典收集算法和各种收集器(如Serial、CMS、G1、ZGC)的工作原理与适用场景,则是进行JVM性能调优的关键。在实际开发中,需要根据应用的具体特点(如吞吐量优先还是低延迟优先、堆内存大小等)来选择和配置合适的垃圾收集器及参数,以达到最佳的性能表现。

ea1120262413的博客 734

Java基础知识——JVM基础

jvm:运行在操作系统上的假想的计算机 作用: Java源文件——编译器javac——class文件(字节码文件) 字节码文件——解释器(jvmjava——机器码文件 每一台平台解释器不同,但是虚拟机相同,跨平台的原因。 一个程序对应一个虚拟机,多个程序对应多个虚拟机虚拟机之间数据不共享 线程: jvm线程和原生操作系统线程具有直接映射关系 虚拟机线程 (VM thread) 这个线程等待...

weixin_45680007的博客 912

解密Java虚拟机深入探索JVM内存管理与垃圾回收机制

好的,我将按照您的要求,撰写一篇关于解密Java虚拟机深入探索JVM内存管理与垃圾回收机制的文章。

jisumuma的博客 437

JVM垃圾回收机制和算法(十八)

今天开始分析JVM垃圾回收相关问题: 垃圾回收基础知识 什么是 GC Java 与 C++等语言最大的技术区别:自动化的垃圾回收机制(GC) 为什么要了解 GC 和内存分配策略 1、面试需要 2、GC 对应用的性能是有影响的; 3、写代码有好处 栈:栈中的生命周期是跟随线程,所以一般不需要关注 堆:堆中的对象是垃圾回收的重点 方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点 分代回收理论 当前商业虚拟机垃圾回收器,大多遵循.

nandao158的博客 317

深入理解Java虚拟机JVM内存模型与垃圾回收机制详解

虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。对象的内存分配,从概念上讲,应该都是在堆上分配。

lhblg2012的博客 380

JVM垃圾回收

一、设计目标和适用场景设计目标:同时注重低停顿时间和高吞吐量,可以在不牺牲大量吞吐量的情况下实现较短的停顿时间,适用于大内存应用和对响应时间有较高要求的场景。适用场景:例如需要快速响应的交互式应用、大规模数据处理等,尤其是在堆内存较大(几个 GB 甚至更大)时表现出色。设计目标:主要是为了降低垃圾收集的停顿时间,以满足对响应时间要求较高的应用。适用场景:适合于对停顿时间比较敏感的应用,如互联网应用、Web 服务器等。

qq_62097431的博客 2123

Java 入门指南:JVMJava虚拟机垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集

ZGC(Z Garbage Collector) 是一种低延迟、可伸缩性强的垃圾回收器,是JVM 中的一项重要技术。ZGC的目标是 尽可能地减少垃圾回收对应用程序的停顿时间,并且可以处理大内存堆 。 它于Java 11版本中正式发布,适用于大内存低延迟服务的内存管理和回收,在 128G 的大堆下,最大停顿时间为 1.68 ms,停顿时间远胜于 G1 和 CMS。

热带鱼的技术博客 1762

JVM第八讲:GC - Java 垃圾回收基础知识

本文是JVM第八讲, Java 垃圾回收基础知识垃圾收集主要是针对堆和方法区进行;程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收

Jet_qi的博客 1468

JVMJava垃圾回收垃圾收集器_java 主动发起回收

运行时内存区域 :虚拟机栈、程序计数器、本地方法栈、Java堆、方法区。

2401_86963487的博客 1513

JVM堆内存介绍、垃圾收集算法垃圾回收器汇总

JVM堆内存介绍、垃圾收集算法垃圾回收器汇总

scoful的专栏 2万+

pg054-7series-pcie_pciexilinx_pg054_xilinx手册_XILINXPCIE_pcie_源码.

pg054-7series-pcie_pciexilinx_pg054_xilinx手册_XILINXPCIE_pcie_源码.zip

上一篇: 本周问题记录mysql容易忽略的问题
下一篇: 游戏技术、设计和运营总结
cdjason
博客等级 码龄16年 14粉丝 99原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值