当前位置: 首页 > news >正文

[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是个多人多任务的系统&#xff0c…...

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…...

React Native 导航系统实战(React Navigation)

导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

今日科技热点速览

🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: ​onCreate()​​ ​调用时机​:Activity 首次创建时调用。​…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)​现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...