分代回收机制

news2024/12/26 11:33:34

分代回收机制

JVM分代回收策略

JVM分代回收策略就是Java 虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代、老年代,永久代,不过永久代在JDK1.8永久移除了,被元空间取代了

新生代

新生代主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。一般采用的 GC 回收算法是复制算法。 新生代又可以继续细分为 3 部分:Eden、Survivor0(简称 S0)、Survivor1(简称S1)。这 3 部分按照 8:1:1 的比例来划分新生代。当JVM无法为新建对象分配内存空间的时候(Eden区满的时候),JVM触发MinorGc。因此新生代空间占用越低,MinorGc越频繁。MinorGC 触发机制是Eden区满的时候,JVM会触发MinorGC。

详细过程

  • 绝大多数刚刚被创建的对象会存放在 Eden 区(如果新创建的对象占用内存很大则直接分配给老年代)
  • 当 Eden 区第一次满的时候,当Eden区内存不够的时候就会触发一次Minor GC进行一次垃圾回收。首先将 Eden 区的垃圾对象回收清除,并将存活的对象复制到 S0,此时 S1 是空的。
  • 下一次 Eden 区满时,再执行一次垃圾回收。此次会将 Eden 和 S0 区中所有垃圾对象清除,并将存活对象复制到 S1,此时 S0 变为空。
  • 再下一次 Eden 区满时,再执行一次垃圾回收。此次会将 Eden 和 S1区中所有垃圾对象清除,并将存活对象复制到 S0,此时 S1 变为空。
  • 如此反复在 S0 和 S1 之间切换几次(默认 15 次)之后,如果还有存活对象。说明这些对象的生命周期较长,则将它们转移到老年代中。

骚戴扩展:虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1 岁, 当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold (阈值)来设置。

老年代

一个对象如果在新生代存活了足够长的时间而没有被清理掉,则会被复制到老年代。老年代的内存大小一般比新生代大,能存放更多的对象。如果对象比较大(比如长字符串或者大数组),并且新生代的剩余空间不足,则这个大对象会直接被分配到老年代上。

我们可以使用 -XX:PretenureSizeThreshold 来控制直接升入老年代的对象大小,大于这个值的对象会直接分配在老年代上。老年代因为对象的生命周期较长,不需要过多的复制操作,所以一般采用标记-整理算法或标记-清除的回收算法。老年代的对象比较稳定,所以MajorGC不会频繁执行。MajorGC的耗时比较长,因为要先整体扫描再回收,MajorGC会产生内存碎片。为了减少内存损耗,一般需要合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出OOM。

永久代

永久代(Permanent Generation)是Java虚拟机中的一块内存区域,用于存储类、方法、常量等信息。在Java 8及以前的版本中,永久代是堆内存的一部分,它有一个固定的大小,一旦被占满,就会导致OutOfMemoryError异常。

永久代中存储的信息包括:

- 类的元数据信息,如类名、访问修饰符、字段、方法等。
- 字符串常量池。
- 静态变量。

由于永久代的大小是固定的,而且存储的信息会随着应用程序的运行而不断增加,因此容易导致OutOfMemoryError异常。为了解决这个问题,Java 8及以后的版本中,永久代被移除,取而代之的是元空间(Metaspace)。

元空间是Java虚拟机中的一块内存区域,用于存储类、方法、常量等信息。与永久代不同的是,元空间的大小不再是固定的,它可以根据需要动态调整大小。此外,元空间还可以使用本地内存,从而减少堆内存的使用。

元空间中存储的信息与永久代类似,包括类的元数据信息、字符串常量池、静态变量等。但是,元空间中的类元数据信息不再存储在虚拟机的堆内存中,而是存储在本地内存中。这样可以避免堆内存的碎片问题,提高应用程序的性能。

骚戴理解:方法区包括永久代(Permanent Generation),用于存储类的元数据信息、静态变量、常量等数据。在Java 8及以前的版本中,永久代是方法区的一部分,它有一个固定的大小,一旦被占满,就会导致OutOfMemoryError异常。在Java 8及以后的版本中,方法区被移除,取而代之的是元空间(Metaspace)

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

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

相关文章

【docker】docker compose进阶

docker compose docker compose简介docker compose yaml格式1、docker-compose部署tomcat2、docker-compose部署mysql3、docekr-compose部署lnmp项目需求准备依赖文件、配置nginx配置mysql配置php编写docker-compose.yml配置mysql 4、容器部署registry,进行容器上传…

Springboot+公寓信息服务小程序—计算机毕业设计源码无偿分享需要私信20481

摘要 本论文主要论述了如何使用springboot开发一个公寓信息服务小程序,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述公寓信息服务小程序的当前背景以及系统开发的目的,后续…

STL介绍以及string类

什么是STL 是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么要学习string类 C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便&am…

3-4 RGB LED(智能应用篇)

3-4 RGB LED(智能应用篇) 3-4 RGB LEDRGB-LED及电路示例程序效果演示 3-4 RGB LED Led的灯珠和灯带,相当于点和线(可以画出丰富否画面) 主要介绍led灯珠 RGB-LED及电路 RGB-LED可以发出红、绿、蓝色的光芒&#xff0…

Flutter 09 Future 和 Stream

一、Future 和 Stream 是处理异步操作的两个重要概念: Future: Future 用于表示一个延迟操作的值或错误,即异步操作的结果。通过 Future,可以在异步操作完成后获取其结果。可以使用 async 和 await 关键字来处理 Future&#xf…

Cisco Catalyst 8000v Edge Software, IOS XE Release IOSXE-17.14.01a ED

Cisco Catalyst 8000v Edge Software, IOS XE Release IOSXE-17.14.01a ED Cisco Catalyst 8000V 边缘软件 - 虚拟路由器 请访问原文链接:https://sysin.org/blog/cisco-catalyst-8000v/,查看最新版。原创作品,转载请保留出处。 作者主页&…

Redis笔记-分布式存储方案中哨兵模式配置

以前在系统分析师中学习到了Redis哨兵模式,只知道其中基本概念,但不知道怎么去配这个,今天看到某项目,特意记录下其配置过程。哨兵模式比主从模式,更具有容错性。 Redis分布式存储方案 分布式存储方案 核心特点 主从…

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器, 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为: 解…

开发日记:Object-c 中的 NSString 和 NSMutableString的常用方法

今天讲不可变数组 NSArray 可变数组 NSMutableArray。话不多说,直接上干货。 oc中的数组 可变数组 NSMutableArray使用初始化方法创建可变数组使用便利构造器创建可变数组可变数组追加元素可变数组追加一个不可变数组可变数组删除一个元素可变数组删除指定下标的元素…

IPD推行成功的核心要素(十七)矩阵型组织架构设计实现多组织协同以便快速抓取市场机会

随着企业规模不断增长,业务越来越复杂,组织架构对企业高效运作的影响也越来越大。加之企业所处的市场环境瞬息万变,机会稍纵即逝。传统金字塔型的组织架构,完全无法满足这样快速灵活的要求。而IPD体系设计了产品线(IPM…

decoy靶机复现

靶机设置 设置网卡ens33 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机ip为192.168.112.149 端口扫描 nmap 192.168.112.149 -p- -sV -O -Pn 访问浏览器 默认是8080,需要更改为80端口 下载好之后发现解压需要密码 破解密码 将该安装包放到kali中…

配置Prettier+Vscode setting提高前端开发效率

前言 大家好,上一篇一文读懂 系列的文章中我们介绍了前端的代码格式化校验工具ESLient。代码格式是进行自动校验了,但你还要一个个的微调,很麻烦不是吗? 本文介绍和ESLient配合使用的Prettier实现编译器自动将代码格式化。 同时也…

Nat Methods编委:积极探索AI与生物学交叉的高质量基于人工智能方法的论文发表|顶刊速递·24-08-19

小罗碎碎念 今天分享的这篇文献(特刊)发表于《Nat Methods》,目前IF36.1。 分享这篇文献是临时做的决定,因为在朋友圈看到有关这篇特刊的介绍,对标题很感兴趣,所以我立刻找到对应的文章来详细分析一下。 在…

Leetcode JAVA刷刷站(35)搜索插入位置

一、题目概述 二、思路方向 为了实现这一功能,我们可以使用二分查找的变种来找到目标值或确定其应插入的位置。在二分查找过程中,我们不仅检查中间元素是否等于目标值,还根据比较结果更新搜索的上下界。如果目标值大于中间元素,则…

一文带你从源码中学习那些实用的位运算技巧

写在文章开头 众所周知位运算执行效率高于常规运算,通过不同的位运算搭配可以让我们写出简洁高效的代码表达式,所以本文从各大开源项目的源码中介绍一下各类运算技巧及其使用场景。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是…

【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等

程序员养生指南之 【体检】程序人生之健康检查,全身体检项目分类,五大传染病普筛,基因检测等 文章目录 一、全身体检与预防疫苗(年检)1、实验室检测:生化全套检查2、医技检查:辅助诊疗科室3、科…

【Python实现禁用任务管理器】

效果展示: 代码及解析: 提示:使用pyinstaller打包可以避免弹窗,食用更佳哦 提示(2):运行后要等待一段时间再关机哦 禁用代码: 要禁止任务管理器关闭 Python 程序,可以通过修改注册表来实现。以…

【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换

凸包特征检测 凸包就是图像的最小外接多边形,通过图像的轮廓点,找到距离最远的两个点的直线,根据直线找到距离最远的下一个点,直到所有的点被包围在多边形内 读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点 convexHull 获…

bilibiliDown-纯净B站视频解析提取工具

软件简介 bilibiliDown是一款简洁好用的B站视频下载工具,支持由UP主上传的单集,多集以及相关封面,弹幕,字幕,音乐,刮削等等,支持任意粒度批量组合,登录后支持到1080P,大…

Git Merge 实例教学:同步代码库与处理分支冲突的最佳实践

文章目录 前言一、git merge是什么?二、git merge基本用法1. 合并两个分支2. 合并时创建合并提交3. 快进合并(Fast-forward Merge)4. --abort参数5. --continue参数6. -X theirs参数 三、实际例子1. 更新仓库2. 将origin/main分支合并到当前分…