JVM学习日志(十一) 对象进入老年代的情况 及 空间担保机制

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 对象进入老年代的情况 及 空间担保机制 简述

对象进入老年代的情况

  1. 幸存者区装不下
  2. 对象太大了
  3. 年龄到达15岁

对象动态年龄判断

为了能能够更好的使用不同程序的内存状况,HotSpot虚拟机并不是永远要求对象的年龄必须达到-XX MaxTenuringThreshold才能够晋升为老年代,如果在Survivor空间中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年代,无需等到-XX:MaxTenuringThreshold中要求的年龄

空间分配担保机制

老年代空间够用

首先:在发生MinorGC 之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次MinorGC可以确保是安全的

试想一个极端情况就是MinOrGC后所有对象存活下来,那所有的对象都会进入老年代,如果老年代判断剩余空间是大于所有对象的,那么就可以放心担保进入老年代

老年代空间不够

如果执行MinOrGC 之前,发现老年代的可能用内存空间已经小于新生代的全部对象大小了,那么这个时候就有可能新生代minorGC后的对象全部存活,然后需要转移到老年代,但是老年代空间又不够的情况,(理论上有这种可能),因此JVM在MinorGC之前,当判断老年代的可用内存已经小于新生代的全部对象大小,会有一个参数-XX:HandlePromotionFailure是否设置,如果有该值的设置,那会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,当判断到历次平均大小是小于老年代可用内存空间的,将尝试进行一次MinorGC,尽管这次MinorGC是有风险的,如果小于,或者-XX:HandlePromotionFailure没有设置,那这是就要改为一次FullGC

老年代垃圾回收算法

标记整理算法

标记-复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低,更为关键的是,如果不想浪费50%空间,就需要有额外的空间进行分配担保,以应对被使用的内容中所有对象都是100%存活的极端情况,所以在老年代一般不能直接选用这种算法

针对老年代对象的存亡特征,1974年提出了另外一种有针对性的标记整理算法,其中的标记过程仍然与"标记-清除算法"一样,但是后续的步骤不是直接对可回收对象进行清理,而是让所有存货的对象都向内存空间的一端移动,然后直接清理掉边界以外的内存,"标记整理算法"的示意图

image-20230426105513748.png

标记-清除算法与标记整理算法本质差异在于前者是一种非移动式的回收算法,而后者是移动式的,是否移动回收后的存活对象是一项优缺点并存的风险决策:

如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活的区域,移动存活对象并更新,所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行,这就更加让使用者不得不小心翼翼的权衡其弊端了,像这样的停顿被最初的虚拟机设计者形象的描述为“stop The world"

老年代的垃圾回收算法速度至少比新生代的垃圾回收算法的的速度慢10倍!如果频繁的出现老年代的FullGC,会导致系统性能被严重影响,出现频繁卡顿的情况

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
41 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
3天前
|
缓存 Java
JVM对象引用
本次课程聚焦JVM对象引用,涵盖强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,确保对象不会被垃圾回收器回收,适用于需要确保对象存活的场景;软引用在内存不足时会被优先回收,常用于缓存;弱引用的对象随时可能被回收,适合临时对象;虚引用最弱,主要用于接收对象回收通知,进行资源清理。通过合理选择引用类型,可优化内存管理,避免内存泄露。
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
86 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
276 1
|
2月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
44 4
|
21天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
21小时前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
1月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
1月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
22 3
|
1月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
49 1