JVM技术之旅-有几种情况对象直接进入Old区

简介: JVM技术之旅-有几种情况对象直接进入Old区

前提概要 📕


  • JVM的堆内存中分为年轻代与老年代,年轻代又分为Eden区与Survivor区


  • 新对象的创建会分配在年轻代,对象何时进入老年代呢?又有什么样的对象适合放在老年代呢?


  • JVM实现的自动内存管理主要是针对对象内存的回收和对象内存的分配


  • 了解对象何时进入老年代有利于我们合理分配堆内存,减少FullGC的发生。




📕 对象在Eden区中分配 📕


目前主流的垃圾收集器都会采用分代回收算法,因此,新创建的对象都会优先分派在新生代的Eden区内,在新生代中为了防止内存碎片问题,因此垃圾收集器一般都选用“复制”算法。


堆内存的新生代分为:Eden区+Survior1区+Survior2区




📕📕 内存分配流程 📕📕


  1. 每次创建对象时,首先会在Eden区中分配


  1. 若Eden区已满,发生MinorGC,存活的对象都迁移到Survior区(to)区


  1. 然后执行回收,再将新的对象分配到Eden区




📕📕📕 对象进入老年代策略 📕📕📕


(1) 迭代年龄判断(静态年龄)


在对象的对象头信息中存储着对象的迭代年龄(MaxTenuringThreshold),迭代年龄会在每次YoungGC之后对象的移区操作中增加,每执行一次MiniorGC。当这个年龄大于到 15(默认) 之后,这个对象将会被移入老年代.


可以通过这个参数设置这个年龄值

- XX:MaxTenuringThreshold
复制代码



(2) 大对象直接进入老年代


  • 当首次加载分配大对象空间而发生YoungGC的时候:会进行初始化PretenureThresSizehold这个值的。


  • PretenureThresSizehold=N,有一些占用大量连续内存空间的对象在被分配内存开始就会直接进入老年代这样的大对象一般是一些数组,长字符串之类的对象


我们可以通过这个参数设置大对象,这个限额的大小:

- XX:PretenureSizeThreshold
复制代码


注意:此参数只对Serial及ParNew两款收集器有效



(3) 担保分配对象机制(按照空间区计算迁移条件)


  • 若Survior(to)区剩余内存太少,导致对象无法放入该区域时,就会启用“分配担保”,将多出的数据对象直接存转移到老年代/或者直接放入老年代,然后清空Eden区和Survior(from)区


(4) 动态对象年龄判定(按照空间区计算迁移条件)


  • 虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升到老年代,如果在Survivor区中相同年龄(设年龄为age)的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄(age)的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄




📕 引用类型等级 📕


📕📕 强引用 📕📕


平常的代码创建对象都属于强引用,之后当对象变为垃圾对象才会被回收。


📕📕 软引用 📕📕


被SoftReference这个类包裹起来的对象,在进行垃圾收集发现剩余空间不够的时候,全部已创建软引用对象会被一次性回收,这种引用类型常用于对内存比较敏感的缓存中


📕📕 弱引用 📕📕


被WeakReference这个类包裹起来的对象,每次进行垃圾收集操作的时候都会将弱引用对象一次性回收,基本不使用


📕📕 虚引用📕📕


plantomReference又称幽灵引用,随时都会被回收




📕📕 未确认-对象动态年龄判断 📕📕



此策略发生在Survivor区,当Survivor区中的一批对象的总大小大于Survivor区空间大小的一半,在这个区域中,对象年龄大于这批对象的最大年龄的所有对象会被移入老年代.


📕📕📕 看下面的例子 📕📕📕


假设我这里按照年龄划分了10批对象,对象年龄依次为1-10,现在年龄1到3这批对象的总大小大于Survivor空间一半,则对象为4-10的所有对象会被放入老年代


📕📕📕 适合存放老年代的对象 📕📕📕


  • 策略一:将可能长期存活的对象直接放入老年代


  • 策略二:避免移区时的复制操作浪费资源


  • 策略三:不能将还有引用的对象当做垃圾回收掉


  • 策略四:将可能长期存活的对象直接放入老年代


观察这几条策略并结合GC区别我们可以发现一些端倪



📕📕📕年轻代的空间很宝贵📕📕📕


  • 不应放入长期对象与较大对象占用空间


  • 存活时间短的对象应让其在年轻代存活直至死


  • 因为这些对象放入老年代后很快死亡,又不能及时回收,造成内存浪费,更快的触发FullGC


因此在程序运行过程中,合理设置参数,使一些可能长期存活的框架对象与缓存对象,一些大对象应放入老年代



相关文章
|
5月前
|
监控 Oracle Java
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,探索各大JVM虚拟机特色 —— JVM故障排除指南(先导篇)
94 0
|
4月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
85 1
|
3月前
|
存储 监控 算法
(六)JVM成神路之GC基础篇:对象存活判定算法、GC算法、STW、GC种类详解
经过前面五个章节的分析后,对于JVM的大部分子系统都已阐述完毕,在本文中则开始对JVM的GC子系统进行全面阐述,GC机制也是JVM的重中之重,调优、监控、面试都逃不开的JVM话题。
|
3月前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
5月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
58 0
|
5月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
146 0
|
4月前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
43 1
|
4月前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
61 3
|
3月前
|
监控 Java 调度
探索JVM性能调优,调优不仅是技术挑战,更是成长过程。
【7月更文挑战第1天】探索JVM性能调优:** 本文深入JVM内存模型,关注堆内存与方法区、栈的优化,通过调整-Xms, -Xmx及垃圾收集器参数减少GC频率。探讨了Serial到G1等垃圾收集器的选择策略,利用jstat、jmap等工具诊断性能瓶颈。实战案例中,通过问题定位、内存分析解决Full GC问题,强调开发者需理解JVM原理,运用工具在复杂场景下实现高效调优。调优不仅是技术挑战,更是成长过程。
36 0
|
4月前
|
存储 缓存 算法
详解JVM内存优化技术:压缩指针
详解JVM内存优化技术:压缩指针