图解 Java 垃圾回收机制,写得非常好! 侵删

2023-10-29

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。

第一步:标记

垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。

上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。

第二步:清除

这一步会删掉标记出的未引用对象。

内存分配器会保留指向可用内存的引用,以供分配新对象。

压缩

为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。

为什么需要分代垃圾收集?

之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。

来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)

上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。

JVM 分代

根据之前的规律,就可以用来提升 JVM 的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。

新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。

Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。

老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为 Major GC。

Major GC 也会触发STW(Stop the World)。通常,Major GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major GC的STW的时长受年老代垃圾回收器类型的影响。

永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java SE类库和方法也存储在这里。

如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。

世代垃圾收集过程

现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用的。后面的图片将介绍JVM中的对象分配和老化过程。关注微信公众号,,一份超全 JVM 调优攻略。

首先,将任何新对象分配给 eden 空间。两个 survivor 空间都是空的。

当 eden 空间填满时,会触发轻微的垃圾收集。

引用的对象被移动到第一个 survivor 空间。清除 eden 空间时,将删除未引用的对象。

在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区(S1)。

此外,第一个Survivor区(S0)中,在上一次Minor GC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。

在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。

 此幻灯片演示了 promotion。在较小的GC之后,当老化的物体达到一定的年龄阈值(在该示例中为8)时,它们从年轻一代晋升到老一代。

随着较小的GC持续发生,物体将继续被推广到老一代空间。

所以这几乎涵盖了年轻一代的整个过程。最终,将主要对老一代进行GC,清理并最终压缩该空间。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解 Java 垃圾回收机制,写得非常好! 侵删 的相关文章

  • mysql索引

    为什么要使用索引 1 可以加快数据的检索速度 大大减少检索的数据量 这也是使用索引的主要原因 2 帮助服务器避免排序和临时表 3 将随机IO变为顺序IO 使用索引要注意的事项 1 在经常需要搜索的列上创建 可以加快搜索速度 2 在经常使用w
  • 什么是CVR,CTR,CPC,CPA,ROI?

    CVR Click Value Rate 转化率 衡量CPA Cost Per Action 广告效果的指标 CTR Click Through Rate 点击率 CPC Cost Per Click 按点击计费 CPA Cost Per
  • Apollo规划模块-规划器迭代版本

    一 三维问题 降维解决 x y维度求解路径规划 在路径规划的基础上进行s t速度规划 二 Apollo 规划器版本迭代 rtk循 1 0 EM Planning 基于DP和QP 1 5 Lattice Planning 路径和速度同时规划的
  • [网络安全提高篇] 一一五.Powershell恶意代码检测 (3)Token关键词自动提取

    网络安全提高班 新的100篇文章即将开启 包括Web渗透 内网渗透 靶场搭建 CVE复现 攻击溯源 实战及CTF总结 它将更加聚焦 更加深入 也是作者的慢慢成长史 换专业确实挺难的 Web渗透也是块硬骨头 但我也试试 看看自己未来四年究竟能
  • ExecutorService 的理解和使用

    前言 我们之前使用线程的时候都是使用new Thread来进行线程的创建 但是这样会有一些问题 如 a 每次new Thread新建对象性能差 b 线程缺乏统一管理 可能无限制新建线程 相互之间竞争 及可能占用过多系统资源导致死机或oom
  • AIX学习笔记

    学习笔记 这是我看191redbook第三遍的时候做的手记 放在这里大家提提意见 Created by workaholic 第一部分 系统启动问题cfgmgr configures devices and optionally insta
  • 在线生成发射爱心!生成网站直接发给你的ta

    一个网站直接帮你生成带名字的发射爱心 还可以直接分享给朋友看 网站放在最下面了 自从上次发了动态爱心的制作代码后 很多群友都来问 如何改名字 如何改文件 手机上如何编辑 这让我思考一个问题 能不能直接做成一个网站 点进去之后输入名字 点一下
  • 一个驱动同时兼容mysql5.7和mysql8.0

    driver class name org mariadb jdbc Driver org mariadb jdbc mariadb java client 2 6 0 url jdbc mysql 127 0 0 1 3306 datab
  • 【开源数据下载全步骤】利用Pytorch下载开源数据到本地,以Speech Command为例

    背景 找开源数据来练练手 虽然可以直接通过pytorch或TensorFlow加载使用 但感觉太麻烦了 所以想直接下载到本地使用 上网直接搜数据集没有那种直接下载的链接 最后发现可以直接通过pytorch或是TensorFlow下载 下面以
  • QT开发之环境变量设置

    注 主要方便软件在生成出来以后不需要去qt安装文件夹里面复制那6个dll文件才能运行exe程序的问题 右击我的电脑 gt 属性 gt 高级系统设置 gt 高级选项卡 gt 环境变量按钮 gt Path 编辑此变量 在变量值的最后面添加 QT
  • 程序员如何找女友呢?说说我的经验

    找女朋友 本来在咱们技术人社区 不适合谈 因为这涉及个人选择和价值观的问题 恰逢最近 翟欣欣跟苏享茂事件的尾声 纯技术人员如何去找到另一半 又开始火了 不过 我个人觉得 还是可以提供一些程序员社交的建议 参加技术会议和活动 去参加一些与自己
  • C++ 包管理器

    C 包管理器 Vcpkg Vcpkg 可帮助您在 Windows Linux 和 MacOS 上管理 C 和 C 库 相关资料 Vcpkg 管理 C 和 C 库 vcpkg github conan Conan是分布式跨平台开源的C C 软
  • uniapp自定义导航栏与手机状态栏重叠问题

    HBuildX 创建的应用默认是沉浸式样式 去除自带的导航栏后 页面直通手机顶部状态栏 即页面与手机状态栏重叠问题 处理 配置mainfest json来关闭沉浸式 打开应用的manifest json文件 打开源码视图 如下代码所示 ap
  • mysql5.6安装教程

    1 下载 解压完成之后将其放到你喜欢的地址当中去 这里我默认放在了D盘 这是我的根目录 2 配置环境变量 我的电脑 gt 属性 gt 高级 gt 环境变量 gt 系统变量 选择PATH 在其后面添加 D mysql 5 6 49 winx6
  • C++图书馆管理系统(简单版)

    1 总体功能分析 实用的图书馆管理系统应该至少包括一下功能 1 上传 新进图书以及基本信息的输入 2 删除 旧图书以及基本信息的删除 3 显示 显示图书馆已有的所有图书 4 查找 查询要借阅的图书信息 5 借阅 实现用户办理借阅手续 6 归
  • 关于altium designer 中如何按1:1生成PDF文档的解决方案

    众所周知altium designer是一款集PCB绘制 FPGA设计 原理图设计仿真等与一体的软件 功能很是强大 而且一直在不断更新 深受广大电子爱好者的喜爱 今天我不说其他的 就说说PCB绘制之后产生PDF文件的问题 altium de
  • 几个不错的CRM软件(B/S版)

    http www go2oa com http preview sugarcrm com generate instance php Administrator login ID adminPassword ossuw User login
  • 少年,你渴望元编程的力量吗?——symbol

    元编程的概念有很多文章 通过操作更加底层的api做更多个性化的功能 一句话概括 就是用代码来写代码 一些时候 写各种下划线 前后缀 为了实现一个唯一值或者秘密的特殊辅助值 用来辅助业务逻辑或者说作为一个私有的东西 const onlyone
  • Unity LWRP 学习之 RenderFeature

    RenderFeature是一种扩展LWRP的方法 该方法还是实验版 实现管道的参数的定制 其好处就是不需要修改物体的Shader 比如要实现一个如下图的显示隐藏背后的轮廓的需求 通常是需要修改对应的Shader的 使用两个Pass进行绘制

随机推荐

  • Parasoft SOAtest更新至9.10.6版本,新增API测试创建的机器学习功能

    Parasoft SOAtest 是业内最全面的测试解决方案 有着和loadrunner同样强大的性能测试 压力测试 负载测试功能 其功能包括API测试 SOA测试 云测试 负载与性能测试 开发测试等等 可以帮助开发团队提供一个直观的界面确
  • Windows C++ 判断磁盘类型 判断目录所在磁盘类型 判断是否U盘路径

    include
  • 用Linux搭建web服务器

    搭建web服务器 www 简介 网址及 HTTP 简介 HTTP 协议请求的工作流程 www 服务器的基本配置 实验 实验一 实验二 基于多个虚拟主机IP 基于多个虚拟端口 基于个人Web站点的Web网站 www 简介 网址及 HTTP 简
  • redis缓存击穿、雪崩、穿透及业务场景

    一 缓存击穿 1 概念 缓存击穿 由于并发查询同一热点数据而缓存的热点数据到时失效导致用户请求直接访问数据库 造成数据库压力过大 2 业务场景 一款冷门商品突然爆火 原本redis中冷门商品数据设置了定时过期 爆火后大量请求同时去redis
  • xilinx UART-lite AXI4接口testbench

    升级到vivado2015后 为了升级以及zynq系列FPGA MPSOC考虑 xilinx后续IP将都支持AXI接口 但UART的设计并没有找到example wavform testbench 搞了大半天才把串口调通 串口波特率设置为1
  • 深度学习----tensorflow神经网络(二分类)

    1 自写数据集 二分类 import tensorflow as tf import numpy as np import matplotlib pyplot as plt 使用tensorflow框架 建立神经网络 包含1个隐藏层 使用底
  • Exchange2010批量删除邮件

    在Exchange2010里若要删除某个用户发出的邮件 可以通过EMC控制台授予管理员 管理完全访问权限 通过OWA登录到用户邮箱删除 另外 更简便的方法为使用Exchange2010的命令来处理 可分以下几步处理 1 对操作用户赋予mai
  • Docker的Redis集群部署实战

    参考狂神视频 先把我们的服务器上的容器删除 便于我们下面的测试 root iZwz9hv1phm24s3jicy8x1Z docker rm f docker ps aq 825a4fec0d96 471ad631ae01 65063d37
  • java bufferreader_Java输入流之BufferReader和Scanner的用法!

    原帖地址 http blog csdn net kezhongke article details 7612327 在Java中 我们都知道Java的标准输入串是System in 但是我们却很少在Java中看到谁使用它 这是因为我们平时输
  • [python]csv数据处理 将目录下所有csv文件取出想要的列,去重并存入新csv

    代码 import pandas as pd import os import csv path r home kali Desktop 结果文件10 1 for dirpath dirnames filenames in os walk
  • Python魔术方法-Magic Method

    介绍 在Python中 所有以 双下划线包起来的方法 都统称为 Magic Method 例如类的初始化方法 init Python中所有的魔术方法均在官方文档中有相应描述 但是对于官方的描述比较混乱而且组织比较松散 很难找到有一个例子 构
  • JS版数据结构—树(学习一篇足矣)

    树的深度与广度优先遍历 深度优先遍历 尽可能的搜索树的分支 广度优先遍历 先访问离根节点最近的节点 深度优先遍历 第一步 访问根节点第二部 对根节点的children挨个进行深度优先遍历 const dfs root gt console
  • Android的消息处理机制(图+源码分析)——Looper,Handler,Message

    百度二面的时候 觉得自己源码分析太差 没有深入 面试官估计觉得我很不爽 恩 来吧 自己结合这篇文章 基本上把android消息机制给弄清楚了 http www androidzz com 2011 09 android looper han
  • C++ shared_ptr

    为了解决内存泄漏问题 C 标准库内包含了智能指针 shared ptr是其中的一种 include
  • canal 的 serverMode 模式

    serverMode 为 tcp 需要自定义 canal client 实现消息发送到消息队列 serverMode 为 kafka 或者RocketMQ rabbitmq pulsarmq 不需要 canal client 直接使用消息队
  • java 位运算取8位_【算法】位运算与经典八皇后问题

    文章来源 https mp weixin qq com s 14jQ1yLL4Cw6ufI2E3R yg 作者 码海 前言 位运算在生产或算法解题中并不常见 不过如果你用得好 可以达到事半功倍的效果 而且位运算用得好 也可以极大地提升性能
  • JVM基本结构

    1 JVM 基本架构 2 区域作用 tips Jdk1 6及之前 有永久代 常量池1 6在方法区 Jdk1 7 有永久代 但已经逐步 去永久代 常量池1 7在堆 Jdk1 8及之后 无永久代 常量池1 8在堆 新增元空间 不属于虚拟机 基于
  • Dynamics 365 CRM证书更换

    周末更新公司crm服务器证书时出现一些问题 感谢提供支持的第三方公司 主要步骤参考如下博文https blog csdn net hyhcl article details 109444954 现把存在的问题补充如下 1 如果需要更新crm
  • CTFshow 命令执行 web41

    文章目录 源码 前言 解题 源码
  • 图解 Java 垃圾回收机制,写得非常好! 侵删

    自动垃圾回收是一种在堆内存中找出哪些对象在被使用 还有哪些对象没被使用 并且将后者删掉的机制 所谓使用中的对象 已引用对象 指的是程序中有指针指向的对象 而未使用中的对象 未引用对象 则没有被任何指针给指向 因此占用的内存也可以被回收掉 在