第3篇:JVM中内存分配及回收策略

本文介绍Java对象在内存中的分配过程,包括逃逸分析、标量替换、TLAB分配等关键概念,并解释了对象如何从年轻代晋升到老年代的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分配原理

当执行创建对象操作时,首先进行逃逸分析(其实就是该对象是否会被外部方法所引用(就是作用域),若不会则进行标量替换(就是对象中成员变量是基本数据类型的在栈帧/寄存器中进行创建),可以分担堆内存压力,毕竟出栈就会销毁);若逃逸分析不通过则进行大对象(参数:“-XX:PretenureSizeThreshold”)判断;若判断通过则直接进入老年代,若不通过则进行TLAB(Thread Local Allocation Buffer,即线程本地分配缓存区,就是向eden区申请一块很小的内存空间(线程私有的)来存放对象),若大小足够存放该对象则存放,若不够则直接在eden区中进行创建;当eden区满后,会进行Minor GC,存活对象会进入Survivor区,其他对象会由垃圾回收线程进行回收;判断对象年龄是否等于15(默认值为15,设置参数“-XX:MaxTenuringThreshold”),或者当前存放存活对象的Survivor区域的年龄1+年龄2+。。。+年龄n>Survivor内存大小的50%,则对象直接进入老年代。

二、原理图

在这里插入图片描述

小结

原理中涉及的知识点有:

  1. 逃逸分析;
  2. 对象优先在Eden区分配;
  3. 大对象直接进入老年代;
  4. 长期存活的对象将进入老年代;
  5. 动态对象年龄判断;
  6. 空间分配担保。

内存回收与垃圾收集器在很多时候都是影响系统性能、并发能力的主要因素之一,虚拟机之所以提供多种不同的收集器以及大量的调节参数,是因为只有根据实际应用需求,实现方式选择最优的收集方式才能获取最高的性能。没有固定收集器、参数组合,也没有最优的调优方法,虚拟机也就没有什么必然的内存回收行为。因此,学习虚拟机内存知识,如果要到实践调优阶段,那么必须了解每个具体收集器的行为、优势和劣势、调节参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值