JVM中释放内存的三种方法

这篇具有很好参考价值的文章主要介绍了JVM中释放内存的三种方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

判断是否需要垃圾回收可以采用分析。

1标记--清除算法

分为两个阶段,标记和清除,先利用可达性分型标记还存活的对象,之后将没有被标记的对象删除,这样容易生成空间碎片,而且效率不稳定

  1. 标记阶段:
    标记阶段与可达性分析算法类似,通过从根对象开始遍历对象引用链,标记所有被访问到的对象为存活对象。标记完成后,所有存活对象被标记为"已存活"。

  2. 清除阶段:
    清除阶段是标记-清除算法的特有步骤。在该阶段,算法扫描整个堆内存,找到未被标记的对象,并进行清除操作。清除的对象被认定为垃圾对象,即可以被垃圾回收器回收内存。

清除操作有两种常见的方式:

  • 逐个清除:对于每个未被标记的对象,将其从内存中移除,并释放其占用的内存空间。
  • 延迟清除:将所有未被标记的对象的内存空间标记为可用,而不立即释放。可以在需要申请新内存时,直接将可用空间分配给新对象,避免频繁的内存分配和释放操作。

速 度 较 快

会 造 成 内 存 碎 片

JVM中释放内存的三种方法,JVM,jvm,java,算法

 2.标记整理算法

  1. 标记阶段:
    标记阶段与可达性分析算法类似,通过从根对象开始遍历对象引用链,标记所有被访问到的对象为存活对象。标记完成后,所有存活对象被标记为"已存活"。

  2. 整理阶段:
    整理阶段是标记-整理算法的特有步骤。在该阶段,算法将所有存活对象移到内存的一端,然后对非存活对象所占用的空间进行回收,使之成为可用的内存空间。

整理阶段分为两个步骤:

  • 从内存的起始位置开始,依次遍历所有存活对象,并将其按顺序移动到内存的另一端。移动过程中,保持对象之间的引用关系不变,即更新引用指向新的位置。
  • 在移动完所有存活对象后,释放剩余的内存空间,使之变为可用的内存。

通过标记-整理算法,内存中只保留了存活对象,并且实现了内存的紧凑布局,使得存活对象在内存中连续存放。相比于标记-复制算法,标记-整理算法没有额外的空间浪费,适用于老年代等内存较大的场景。

避免内存碎片的产生,第一阶段也是标记对象,和标记清除的区别在于第二阶段的整理,它是将存活的对象移动到头部

速 度 慢

没 有 内 存 碎 片

JVM中释放内存的三种方法,JVM,jvm,java,算法

3.标记复制法

  1. 标记阶段:
    标记阶段与可达性分析算法类似,通过从根对象开始遍历对象引用链,标记所有被访问到的对象为存活对象。标记完成后,所有存活对象被标记为"已存活"。

  2. 复制阶段:
    复制阶段是标记-复制算法的特有步骤。在该阶段,算法将内存空间划分为两个相等大小的区域,通常称为"From空间"和"To空间"。初始时,所有存活对象位于From空间。

复制阶段分为两个步骤:

  • 从From空间开始,对已标记的存活对象进行复制到To空间。复制过程中,保持对象之间的引用关系不变,即更新引用指向新的位置。复制完成后,From空间中的所有对象都是垃圾。
  • 将From空间与To空间进行交换,使To空间成为新的From空间,原From空间成为新的To空间,此时完成了垃圾回收。

通过标记-复制算法,内存中只保留了存活对象,将垃圾对象全部清理,并且实现了内存的紧凑布局,使得存活对象在内存中连续存放,提高了内存访问的性能。

不 会 有 内 存 碎 片

需 要 占 用 双 倍 内 存 空 间

JVM中释放内存的三种方法,JVM,jvm,java,算法

 文章来源地址https://www.toymoban.com/news/detail-659725.html

到了这里,关于JVM中释放内存的三种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM 内存和 GC 算法

    对象头(Header) 运行时元数据(Mark word):哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳 类型指针 :指向类元数据,确定对象所属类型。如果是数组还要记录数组的长度 实例数据(Instance Data):类中的各类型变量以及父类的相关类型数据。

    2024年02月05日
    浏览(30)
  • java八股文面试[JVM]——JVM内存结构

    参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM 是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构:   方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是

    2024年02月12日
    浏览(38)
  • JVM 堆外内存查看方法

    是否曾经想过为什么Java应用程序通过众所周知的*-Xms 和 -Xmx 调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JVM可能会分配额外的本机内存。这些额外的分配最终可能使消耗的内存超出 -Xmx* 限制。 在本教程中,我们将枚举JVM中本机内存分配的一些常见

    2024年02月07日
    浏览(31)
  • Java # JVM内存管理

    程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存 对象创建: 引用检查 类加载检查 分配内存空间:指针碰撞、空闲列表 分配空间初始化 对象信息设置(对象头内) 对象内存布局: 对象头 实例数据 对象填充 对象访问定位: 句柄访问 直接

    2024年02月13日
    浏览(34)
  • JVM | Java内存区域

    以上笔记基于JavaGuide整理 JDK 1.8: 线程私有 的:程序计数器,虚拟机栈,本地方法栈 线程共享 的:堆,方法区(元空间),直接内存 (非运行时数据区的一部分) 程序计数器有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而 实现代码的流程控制 ,如:顺

    2024年02月08日
    浏览(66)
  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(37)
  • JVM——Java 内存区域详解

    如果没有特殊说明,都是针对的是 HotSpot 虚拟机。 基本问题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题 String 类和常量池 8 种基本

    2024年02月13日
    浏览(33)
  • Java jvm 内存溢出分析

    我们经常用visualVm监控Jvm的内存,cpu,线程的使用情况,通常可以根据内存不断增长来判断内存是否存在不释放。但是我们不可能时时盯着去看,这里涉及jvm堆内存配置,堆内存参数配置和调优会在其他章节编写。 如果真是内存溢出了,线上出现的我们需要配置JVm内存溢出,

    2024年02月09日
    浏览(41)
  • java JVM 内存GC查看

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 1、命令格式 jstat命令命令格式: jstat [Options] vmid [interval] [count] 参数说明: Options,选项,我们一般使用 -gcutil 查看gc情况 vmid,VM的进程号,即

    2024年01月22日
    浏览(25)
  • 【JVM】Java内存泄露的排查思路?

    Java内存泄露(Memory Leak)是指在Java程序中,无用的对象占用了 堆内存 ,但无法被垃圾回收器回收释放,从而导致可用内存逐渐减少,最终可能导致内存耗尽或性能下降的问题。 说明一般对于内存泄漏。都是针对 堆 的。 程序一般出现内存泄漏会有 两个状态 一是一启动导致

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包