[JVM]问下,对象在堆上的内存分配是怎样的
Java 技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存
这里面最重要的就是,对象在堆上的内存分配
这篇文章来具体讲讲
堆整体上来说,主要分为 新生代 & 老年代
新生代又分为: Eden 区和 Survivor 区, Survivor 区又分为 from 指针指向的区域和 to 指针指向的区域
Eden : From Survivor : To Survivor = 8 : 1 : 1
(原谅我一下,我实在是懒得画图了,哈哈哈哈
接下来就是对象来了,首先是会把它放在 Eden 区中
如果经历了一次 Minor GC ,它仍然存活,而且此时 Survivor 区域足够,那么就会把它移动到 Survivor 区域中 from 指针指向的区域,同时对象年龄加 1,接下来又是一次 Minor GC ,这个对象依然存活下来了,此时会将 Eden 区和 from 区中的存活对象复制到 to 指针指向的区域中,然后 from 指针和 to 指针会互换一下
以上这个过程一直重复,假设那个对象一直在存活,到一定程度之后(默认是 15 ),会被晋升到老年代
进入了老年代之后,如果要进行垃圾回收,那就需要来一次 Full GC 了,这大概就是整个过程
上面的过程是正常的一个流程,那也有不正常的情况呢,比如经常说的,如果 new 了一个大对象, Eden 区放不下,此时会直接放到老年代里面去
这种情况肯定是不太好的啦,毕竟老年代的对象是需要来一次 Full GC 才会被清理的,如果刚才 new 的大对象就用了一次,那岂不是太浪费内存了,所以这种情况要尽可能避免
那除了这种情况之外,还有其他情况嘛?
有的,比如以下情况:
- 在 Hotspot 虚拟机中,如果 Survivor 空间中相同年龄所有对象总和,大于 Survivor 空间一半,此时年龄大于或等于该年龄的对象就可以直接进入老年代中
- 在发生 Minor GC 之前,先检查老年代最大可用的连续空间是否大于新生代所有对象空间
- 是的话,则进行 Minor GC
- 否的话,查看
-XX:HandlePromotionFailure参数设置是否允许担保失败- 如果允许,会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,尝试进行一次 Minor GC
- 如果小于或者设置不允许,则会进行 Full GC
- 备注: 取历史平均值是一种赌概率的解决办法,如果某次 Minor GC 存活后的对象突增,远高于历史平均值的话,依然会导致担保失败,会重新发起一次 Full GC ,虽然担保失败的圈子挺大的,但通常还是会把
-XX:HandlePromotionFailure开关打开,避免 Full GC 过于频繁
其他:
Eden : From Survivor : To Survivor = 8 : 1 : 1 ,我觉得这个比例设置的挺巧妙,在新生代中,用的垃圾回收算法是 标记-复制 算法,这种算法一般来讲利用率是 50% ,但是设置比例为 8:1:1 之后,利用率就达到了 90%
还有就是为什么新生代对象存活年龄默认是 15 呢,能不能设置一个大于 15 的值呢?这是因为在 Hotspot 虚拟机中,是用 4 个标志位来表示对象年龄的,最大值就是 15 了,不能再大了
你可能会问,这 4 个标志位是在哪里呢?在 Java 的对象头里面,有 Mark Word,提到 Mark Word 熟悉吗? synchronized 的锁信息也有存在这里的,刚好我以前写过这方面的文章,给个跳转链接: [Java 并发]深入浅出 synchronized 与锁
参考:
深入理解 Java 虚拟机
以上
感谢您的阅读~
相关文章:
[JVM]问下,对象在堆上的内存分配是怎样的
Java 技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存 这里面最重要的就是,对象在堆上的内存分配 这篇文章来具体讲讲 堆整体上来说,主要分为 新生代 & 老年代 新生代又分为: Eden 区和 Survivor 区, Survivo…...
TCP/IP网络分层模型
TCP/IP当初的设计者真的是非常聪明,创造性地提出了“分层”的概念,把复杂的网络通信划分出多个层次,再给每一个层次分配不同的职责,层次内只专心做自己的事情就好,用“分而治之”的思想把一个“大麻烦”拆分成了数个“…...
数据结构-----红黑树的插入
目录 前言 红黑树的储存结构 一、节点旋转操作 左旋(Left Rotation) 右旋(Right Rotation) 二、插入节点 1.插入的是空树 2.插入节点的key重新重复 3.插入节点的父节点是黑色 4.插入节点的父节点是红色 4.1父节点是祖父…...
Excel大量表格选择,快速定位表格
excel有大量表格,快速定位表格方法。 在这个区域电机鼠标右键 出现表格选择。(此处方便查看15个表格),如果超过15个表格可以选择其他工资表。 选择其他工作表会弹出列表框如下图 特此记录 anlog 2023年10月12日...
力扣环形链表(1)进阶环形链表(2)及环形链表的约瑟夫问题
为了加深对环形链表的理解和掌握,这两道题是很不错的选择。 这里所说环形链表不是一个圈圈的结构,而是带环链表。 链接:环形链表(1) 注意这里链表的长度 所以要注意链表是否为空 第一种方法,应该是比较容易…...
linux文件权限与目录配置
用户与用户组 linux一般将文件可读写的身份分为三个类别:拥有者(owner)、所属群组(group)、其他人(other) 三种身份都有读、写、执行等权限 文件拥有者 linux是个多人多任务的系统,…...
2023年10月wxid转微信号方法
在9月份tx做了一次调整,以前很多wxid转微信号的办法都失效了。 今天分析了一下微信。捣鼓了一下午。现在已经实现了wxid转微信号。不管对方是否在群里,是否是你的好友 都能转。一分钟出60条左右。 我们先创建一个文本文件,将要转换wxid 放进…...
【Spring Boot 源码学习】@Conditional 条件注解
Spring Boot 源码学习系列 Conditional 条件注解 引言往期内容主要内容1. 初识 Conditional2. Conditional 的衍生注解 总结 引言 前面的博文,Huazie 带大家从 Spring Boot 源码深入了解了自动配置类的读取和筛选的过程,然后又详解了OnClassCondition、…...
jupyter_快速开始
文章目录 使用 Anaconda 启动 jupyter-lab纯 python 环境使用 jupyter-notebook纯 python 环境使用 jupyter-labjupyter-lab 配置文件相关jupyter-notebook 配置文件相关jupyter-lab 与 jupyter-notebook 的关系与区别 使用 Anaconda 启动 jupyter-lab 启动一个cmd 命令行&…...
英特尔 SGX 技术概述
目录 介绍概述指示结构Memory安全区页面缓存Enclave Page Cache (EPC)安全区页面缓存映射Enclave Page Cache Map (EPCM) Memory ManagementStructures页面信息Page Information (PAGEINFO)安全信息Security Information (SECINFO)分页加密元数据Paging …...
SpringBoot核心功能与基础配置
SpringBoot简介 原先的Spring程序缺点,包括依赖设置繁琐,每项jar的引用都需要自己撰写。并且配置繁琐,配置文件中也需要自己写加载bean等。由此针对原始的Spring程序,Pivotal团队提供的全新框架——SpringBoot,其设计…...
vue3后台管理框架之Mock开发
前言 在前后端对接中,有时后端的接口数据没有 那么快能给出,因此我们可以通过mock模拟自己的请求数据,在后端接口没有给出的同时,先使用mock请求的数据完成前端相关的逻辑 官方文档:vite-plugin-mock vite 的数据模…...
03_51单片机点亮LED灯
51单片机是一种非常常见的单片机型号,广泛应用于各种嵌入式系统和电子设备中。LED灯是一种常见的输出设备,用于显示信息或指示状态。下面是关于51单片机控制LED灯的介绍: 1. 连接LED灯:将LED的正极连接到51单片机的一个I/O引脚&a…...
【前端设计模式】之备忘录模式
备忘录模式是一种行为设计模式,它允许在不破坏封装性的前提下捕获和恢复对象的内部状态。在前端开发中,备忘录模式可以用于保存和恢复用户界面的状态,以及实现撤销和重做功能。 备忘录模式特性: 封装了对象的状态:备…...
复习Day15:栈与队列part02:20. 有效的括号、1047.删除字符串中所有相邻重复项
我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带的IDE模拟面试环境。 历史博客链接: http…...
基于Java的宠物商城管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
Python的GIL存在的情况下,是否还有必要添加线程锁。
GIL锁的产生: 为了保证在单线程情况下,Python的正常执行和效率,GIL锁产生了,由于只有一把锁就不会产生死锁也不用切换。 对于Python语言而言,只有CPython解释器(用C语言编写的Python解释库)存在…...
基于下垂控制的孤岛双机并联逆变器环流抑制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 在实际应用中逆变器都是并联运行的,但是逆变器的并联运行也存在不少问题,由于线路阻抗差异、各个逆变器输出端瞬时电压幅值不同等,都容易导致环流的出现。环流会导致逆变器损耗增加,从而影响微电网的输出效率…...
spring事务面试题
1.Spring 事务实现方式有哪些? 事务就是一系列的操作原子操作,Spring事务机制主要 包括声明式事务和编程式事务。 编程式事务:通过编程的方式管理事务,自己设置未提交模式,自己获取连接,自己预编译,自己回…...
C++标准库算法整理
目录 1、数值操作 1.1、std::accumulate 1.2、std::inner_product 1.3、std::partial_sum 1.4、std::exclusive_scan 1.5、std::inclusive_scan 1.6、std::reduce 2、相邻元素 2.1、std::adjacent_difference 2.2、std::adjacent_find 2.3、std::unique 2.4、std::u…...
SpinalHDL Pipeline库核心要素解析:从Stageable到流水线构建实战
1. Pipeline核心要素深度解析:从概念到实战在数字电路设计,尤其是处理器流水线这类复杂逻辑的构建中,我们常常需要一种更抽象、更灵活的方式来组织数据流和控制流。传统的RTL描述方式在面对多级流水、动态数据传递和复杂交互时,代…...
Windows Defender终极控制:开源工具defender-control完全指南
Windows Defender终极控制:开源工具defender-control完全指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control…...
面向时序冗余的自适应高效时空动作检测算法研究
面向时序冗余的自适应高效时空动作检测算法研究 摘要 时空动作检测是视频理解领域的核心任务,要求在视频序列中同时识别动作类别并定位其时空边界。现有主流方法虽然取得了显著进展,但普遍存在两个关键瓶颈:一是视频数据固有的高时序冗余导致计算效率低下,二是局部时序依…...
3分钟搞定Windows右键菜单:ContextMenuManager终极优化指南
3分钟搞定Windows右键菜单:ContextMenuManager终极优化指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾经在Windows右键菜单中迷失方向&…...
手把手教你用W25Q32 SPI Flash:从波形图看懂擦除、写入和读取(附完整代码)
手把手教你用W25Q32 SPI Flash:从波形图看懂擦除、写入和读取(附完整代码) 在嵌入式开发中,SPI Flash存储器因其高性价比、大容量和简单接口而广受欢迎。W25Q32作为一款32Mb的SPI Flash芯片,被广泛应用于物联网设备、消…...
别再只读原始值了!MPU6050数据滤波与姿态解算入门:用STM32实现简易角度估算
从原始数据到稳定姿态:MPU6050滤波与解算实战指南 当你第一次成功读取MPU6050的原始数据时,可能会被那些不断跳动的数值弄得手足无措。这些看似杂乱的数据背后,隐藏着设备在三维空间中的运动秘密。本文将带你超越基础的数据读取,探…...
ScrollMonitor:JavaScript滚动监控库的完整指南 - 如何高效监听元素进入视口
ScrollMonitor:JavaScript滚动监控库的完整指南 - 如何高效监听元素进入视口 【免费下载链接】scrollmonitor A simple and fast API to monitor elements as you scroll 项目地址: https://gitcode.com/gh_mirrors/sc/scrollmonitor ScrollMonitor 是一款轻…...
YimMenu:GTA5终极安全防护与游戏体验优化完整指南
YimMenu:GTA5终极安全防护与游戏体验优化完整指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...
深入解析PyTorch-FCN架构:FCN32s、FCN16s、FCN8s模型对比分析
深入解析PyTorch-FCN架构:FCN32s、FCN16s、FCN8s模型对比分析 【免费下载链接】pytorch-fcn PyTorch Implementation of Fully Convolutional Networks. (Training code to reproduce the original result is available.) 项目地址: https://gitcode.com/gh_mirro…...
光纤干涉条纹投射导向的动态三维形貌测量技术【附程序】
✨ 长期致力于条纹投射轮廓术、光纤干涉条纹投射、正弦相位调制、任意步距相移相位解调、系统标定研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于…...
