JVM05_堆的概述、内存结构、复制算法、Minor|Major|Full GC、私有区域TLAB、对象分配、参数总结、逃逸分析、栈上分配、锁消除、标量替换(二)

简介: ⑤. 复制算法⑥. Minor GC | Major GC | Full GC⑦. 针对不同年龄阶段的对象分配原则⑧. TLAB(Thread Local Allocation Buffer)

⑤. 复制算法


  • ①. 一般过程(图解)


微信图片_20220106140418.png


微信图片_20220106140423.png


②. 复制算法详解 掌握


(伊甸园满了,就会触发gc(minor gc),而gc就会把标识为垃圾的对象干掉,不是垃圾的对象就要转移到幸存区,把伊甸园让出来给新的对象用)


过程:


微信图片_20220106140454.png


微信图片_20220106140459.png


微信图片_20220106140503.png


⑥. Minor GC | Major GC | Full GC


①. YONG GC(minor GC):发生在新生代


只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不

高,所以Minor GC非常频繁,一般回收速度也比较快


当Eden代满,会触发minor GC ,Survivor 满不会引发GC


minor gc 会引发STW,暂停其他用户线程,等垃圾回收结束,用户线程才能恢复


②. Major GC:发生在老年代


major GC 是回收老年代的垃圾;major gc 的速度一般比Minor gc 慢10倍以上,STW时间更长


③. Full GC:发生在


full GC 就会出现所谓的STW(stop the world)现象,即所有的进程都挂起等待清理垃圾


full GC是回收老年代和年轻代的垃圾


full gc 是开发调优中尽量避免的,这样暂时时间会短一些


④. 全局GC(major GC or Full GC):


(指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并

不是绝对的)。Major GC的速度一般要比Minor GC慢上10倍以上)


⑦. 针对不同年龄阶段的对象分配原则


①. 优先分配到Eden


②. 大对象直接分配到老年(尽量避免程序中出现过多的大对象)


③. 长期存活的对象分配到老年代


④. 动态对象年龄判断


(如果Survivor 区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄对象可以直接进入老年代,无须等到MaxTenurningThreshold中要求的年龄)


⑤. 空间分配担保 -XX:HandlePromotionFailure


(JDK6之后,只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC)


⑧. TLAB(Thread Local Allocation Buffer)


①. 从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内


②. 尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选


③. 默认情况下,TLAB空间的内存非常小,仅占有整个Eden空间的1%,当然可通过选项"-XX:TLABWasteTargePercent"设置TLAB空间所占用Eden空间的百分比大小


④. 一旦对象在TLAB空间分配内存失败时,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存


⑤. 图解:


微信图片_20220106140644.png



相关文章
|
1月前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
97 4
|
1月前
|
存储 程序员 C++
C++堆内存分配
C++堆内存分配
28 2
|
30天前
|
Java Linux
JVM堆内存诊断
JVM堆内存诊断
23 0
|
4天前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
15 3
|
10天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
36 3
|
1天前
|
存储 缓存 监控
深入解析JVM内存分配优化技术:TLAB
深入解析JVM内存分配优化技术:TLAB
|
3天前
|
存储 监控 算法
Java中的内存管理:从堆到栈的深入解析
Java中的内存管理:从堆到栈的深入解析
|
21天前
|
Java
JDK8中JVM堆内存划分
JDK8中JVM堆内存划分
16 0
|
30天前
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
10 0
|
1月前
|
存储 弹性计算 运维
调整虚拟机内存参数的 shell 脚本
【4月更文挑战第29天】
32 2