深入堆空间

news2024/9/22 15:49:07

堆空间用来干嘛的?

我们知道基础类型的变量对象的引用既可以在也可以在上,但是对象一定是在空间的。

堆上存储的是从GC Root可达的活跃对象。

什么是GC Root?

垃圾回收器在判断哪些对象该回收的时候,需要一个标准,那就是从GC Root开始,看看哪些对象能访问到,访问到的就认为还有用,保留下来,其他的回收掉。而这些GC Root可以认为是一些特殊的对象,本质上也还是对象。

哪些是GC Root?

栈上的局部变量

活跃的线程对象

JNI接口使用的对象

类的静态变量

堆的划分?

新生代:存储的是年轻一些的对象。

-Eden:新创建的对象会放在Eden,当空间不足时,会触发Minor GC

-Survivor:有两个一样大小的区域,称为S0和S1,用于存放相对年轻的对象,在Survivor区经过多次垃圾回收仍未释放的对象,会移动到老年代

老年代:存储的是长期存活的对象,来自Survivor区或者超过一定阈值的新创建的对象。当空间不足,会触发Major GC

Minor GC算法

Minor GC流程:

  1. Eden区所有活跃对象age++,移动到S0/S1

  1. S1/S0中所有活跃对象age++并判断是否大于阈值(这个age就是经历过Minor GC的次数),大于阈值的对象会移动到老年代,否则移动到S0/S1

  1. 回收Eden区和S1/S0的对象。

  1. 在Eden区分配空间给新对象。

当然,S0和S1是交替使用的,上一次S0是空的,这次S1就是空的。

这里的阈值可以通过-XX:MaxTenuringThreshold来设置,默认值15,当设置大于15时,会有问题,用于不会移动到老年代

模拟Minor GC流程

初始对象都分配在Eden,红色代表待回收,绿色代表活跃对象。S0和S1是空的,尚未进行过垃圾回收,我们默认S0是initial Target(往这个区域移动)

进行一次垃圾回收,B、C、E、F的age++,直接移动到S0

S1没有对象,不需要移动

Eden区域待回收对象A、D、G被移除

新H对象在Eden区域分配空间


某次分配对象时,又需要Minor GC。

此时S0有使用,说明S1是Target,我们看下流程。

Eden区域的活跃对象I、J、K的age++,移动到S1

S0区域的活跃对象C、E、F先age++,判断还未达到阈值,则移动到S1

清除Eden的H、L、M,清除S0的B

分配N的空间


当某次回收时,发现存在age等于14的对象

此时在S1区域内有age等于14的活跃对象,这个时候会直接移动到老年代。

几个常用的配置

-Xms堆空间的最小值

-Xmx堆空间的最大值

-XX:NewSize 新生代最小值

-XX:MaxNewSize 新生代最大值

-XX:SurvivorRatio S0或S1与Eden的相对大小,

假如-XX:SurvivorRatio = 6,那么表示 ,即

-XX:NewRatio 老年代和新生代的相对大小,

假如-XX:NewRatio = 3,那么表示, 即

-XX:PretenureSizeThreshold 表示超过这个大小的对象,直接放到老年代,而不是Eden

推荐分配:新生代占25%~33%的堆内存大小。

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

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

相关文章

初识项目管理

项目的特性 项目是一项 临时性 的工作,即所有的项目都有确定的开始和结束时间。项目的目的是创造 独特 的产品、服务或成果。项目具有 渐近明细性,即项目随着时间的推移,相关信息逐渐清晰。 项目举例 万事皆项目: 开发信息系统…

川农机械专业小伙转行Java开发,年薪20w

本期学员就业故事,知了姐邀请到一位“特别”的同学,一位从知了堂就业成功近两年的学员再度接受我们的采访。 来自四川农业大学的曾同学,一个本来学机械开挖掘机的粗犷男人,因为不断地努力学习编程,最终成为一个性格闷…

轻松掌握C++的模板与类模板,将Tamplate广泛运用于我们的编程生活

C提高编程 本阶段主要针对C泛型编程和STL技术做详细讲解,探讨C更深层的使用 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。 模板 1.模板的概念 模板就是建立通用的模具,大大提高复用性 例如: 2.函数模板 C另一种编程思想称…

【二分查找】数的范围

数的范围思路二分查找左边界右边界代码实现思路 题目主要的意思在一个升序也就是有序的数组中 找到一段相同数组的起始位置和最终位置 也就是查找两个数的问题 题目给的是升序数列让人很容易想到二分查找来查找两个数 二分查找 我们此时的问题就转化为查找到这段序列的起始位…

Python中变量的作用域精讲

文章目录前言一、局部变量二、全局变量前言 变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的 “有效范围” 将变量分为 “全局变量” 和 “局部变量”。 一、局部变量 局部变…

Linux——进程间通信1

目录 进程间通信目的 进程间通信标准 管道 匿名管道 管道实现进程间通信 管道的特点 进程池 ProcessPool.cc Task.hpp 习题 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件…

前端的浮点数计算问题

加 //加 export const add (num1, num2) > {var r1, r2, m, ctry {r1 num1.toString().split(.)[1].length} catch (e) {r1 0}try {r2 num2.toString().split(.)[1].length} catch (e) {r2 0}c Math.abs(r1 - r2)m Math.pow(10, Math.max(r1, r2))if (c > 0) {va…

Vue3通透教程【七】生命周期函数

文章目录🌟 写在前面🌟 生命周期钩子函数🌟 组合式API生命周期🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章&am…

性能优化之前端项目性能优化的几种方案

加载优化,减少http请求一个完整的 HTTP 请求需要经历 DNS 查找,TCP 握手,浏览器发出 HTTP 请求,服务器接收请求,服务器处理请求并发回响应,浏览器接收响应等过程。Queueing: 在请求队列中的时间。Stalled: …

5.1 STM32学习 中断系统和EXTI外部中断

中断系统中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。中断优先级:当…

框架篇-面试题6-说一下Vue2与Vue3的钩子函数

Vue钩子函数是在Vue实例从创建到销毁的过程中自动执行的函数(在特定的阶段,能够自动自执行的函数)钩子函数用来描述一个组件从引入(创建)到退出(销毁)的全过程中的某个过程Vue2生命周期钩子函数整个过程称为生命周期Vue钩子函数按照组件生命周期的过程分…

作为一名程序员少不了的软件

写在前面的话 就现今我自己接触的项目而言,我发现对于一名程序员来说有些软件是真的必不可少的,防止下次换电脑或者要换操作系统的时候用,特此记录一下。 一、最常使用的,JetBrain全家桶(idea、pycharm、webstorm&…

【办公类-16-06-02】“2022下学期 总园活动室(沙水+建构)排班表(两周一次沙水)”(python 排班表系列)

作品展示:背景需求:上一篇批量制作了“7天轮回14班沙水每周固定建构”的活动室内排班表。一、时段冲突,调整单双周。保教主任抽空检查后,提到:“一个班、上午、下午都有自主游戏(沙水、建构、表演、角色&am…

金三银四、金九银十 面试宝典 JAVASE八股文面试题 超级无敌全的面试题汇总(接近3万字的面试题,让你的JAVA语法基础无可挑剔)

JavaSE八股文 - 面试宝典 一个合格的 计算机打工人 ,收藏夹里必须有一份 JAVA八股文面试题 ,特别是即将找工作的计算机人,希望本篇博客对你有帮助! 本文参考了诸多大佬的面试题帖子,ps:白大锅、哪吒、英雄…

从Linux内核中学习高级C语言宏技巧

Linux内核可谓是集C语言大成者,从中我们可以学到非常多的技巧,本文来学习一下宏技巧,文章有点长,但耐心看完后C语言level直接飙升。 本文出自:大叔的嵌入式小站,一个简单的嵌入式/单片机学习、交流小站 从…

机器看世界

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

为什么红黑树如此受欢迎

平衡二叉查找树有很多,但是我们一提到平衡二叉查找树,常提及的就是红黑树,它的“出镜率”甚至要高于平衡二叉查找树。 红黑树是一种相对平衡的二叉查找树,不符合严格意义上平衡二叉查找树的定义。 目录 红黑树的插入 红黑树的验…

SAP ABAP WebService

第一步:SE37 创建一个远程函数(Remote Function Module)注意该函数需要将Remote Enable开启第二步:创建WebService首先:SE37 打开需要关联的函数在菜单 Utilities->More Utilities->Create Web Service->From…

二 Go的基本语法

1. 基本类型 boolstringint、int8、int16、int32、int64uint、uint8、uint16、uint32、uint64、uintptrbyte // uint8 的别名rune // int32 的别名 代表一个 Unicode 码float32、float64complex64、complex128 2. 三种声明变量 2.1 标准格式 var name type 其中,…

MyBatis-Plus联表查询的短板,该如何解决呢

mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写上一大段…