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

JVM的故事—— 内存分配策略

内存分配策略

文章目录

  • 内存分配策略
  • 一、对象优先在Eden分配
  • 二、大对象直接进入老年代
  • 三、长期存活的对象将进入老年代
  • 四、动态对象年龄判定
  • 五、空间分配担保


一、对象优先在Eden分配

堆内存有新生代和老年代,新生代中有一个Eden区和一个Survivor区(from space或者to space)。当有新的对象分配时,会优先分配在Eden区。当Eden区空间不足分配给新对象时,会进行一次minor GC,回收完没有引用的对象后,先考虑把一些Eden区的对象放到Survivor区,如果放不下,就放到老年代中。

二、大对象直接进入老年代

大对象就是指需要连续大内存的Java对象。比如长字符串或者数量庞大的数组。HotSpot虚拟机提供了-XX:PretenureSizeThreshold 参数,当对象大于该指定大小就会直接进入老年代,这就防止了对象在Eden区和Survivor区来回复制。

三、长期存活的对象将进入老年代

对象通常在Eden区诞生,如果经过第一次Minor GC后仍然存活并能被Survivor区存储,该对象就会被移到Survivor区,并且Age(年龄计数器)为1。此后该对象在Survivor区每经过一次Minor GC,Age就加一。当Age达到一个阈值时,就把该对象放入老年代。

四、动态对象年龄判定

Hotspot虚拟机中并不一定要求对象的Age达到XX:MaxTenuringThreshold设定的值才进入老年代。当Survivor区有一半以上的空间都被相同年龄的对象占据,年龄大于等于该值的对象都可以进入老年代。

五、空间分配担保

在发生Minor GC之前,需要检查老年代最大可用的连续空间是否大于新生代所有对象总和。如果大于,则可以确保Minor GC是安全的;如果不大于,则需要检查XX:HandlePromotionFailure参数的设置值是否允许担保失败。若允许,则用老年代最大可用的连续空间与历次进入老年代的对象平均大小进行对比,若大于,则进行一次有风险的Minor GC,反之进行full GC。若不允许担保失败,则直接进行full GC。


http://www.lryc.cn/news/155330.html

相关文章:

  • 21.CSS的动态圆形进度条
  • Linux_VMware_虚拟机磁盘扩容
  • 中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索
  • 树莓 LUMA-OLED.EXAMPLE使用
  • C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码
  • java IDEA文件路径分层级
  • Spring AOP+Redis实现接口访问限制
  • 互联网后端技术大全!
  • Android SDK 上手指南||第九章 Manifest文件
  • CVE-2023-3450:锐捷 RG-BCR860 命令执行漏洞复现
  • 【ES】elasticsearch8.3.3
  • 2023年下半年广州/深圳软考(中/高级)认证报名,当然弘博创新
  • 2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素
  • 专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航
  • Redis基本了解
  • Seata处理分布式事务之1.7.0
  • 在k8s中用label控制Pod部署到指定的node上
  • vue3 搭配ElementPlus做基础表单校验 自定义表单校验
  • Vue项目中处理key=value格式的数据-案例
  • 如何截取视频中的一段视频?分享几种视频分割方法
  • 《Go 语言第一课》课程学习笔记(十四)
  • windows下配置pcl-python
  • CNN详细讲解
  • pdf怎么编辑文字?了解一下这几种编辑方法
  • MASM32编程状态栏显示字符动画,按钮跑马灯
  • Pytorch-以数字识别更好地入门深度学习
  • 微服务--服务介绍
  • 自定义线程池-初识
  • 低代码平台:IVX 重新定义编程
  • Android之自定义时间选择弹框