Java对象内存分配流程

目录

Java对象内存分配流程

1. 流程介绍

2. 什么是逃逸分析

1.为什么要分配在栈上?

2.什么情况下会分配在栈上?

3.什么是逃逸分析

3.什么是大对象

4.什么是TLAB


Java对象内存分配流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7aRvUZ6-1611884478956)(https://note.youdao.com/yws/res/47251/6E800DEEE53C47F39D396196F1FED4AE)]

1. 流程介绍

1.执行new指令

2.进行逃逸分析,判断是否能够分配到栈上

      2.1 是分配到栈上,等方法出栈时,对象内存销毁,可有效减少GC的次数

     2.2 无法分配到栈上

3.判断是否是大对象

     3.1 是大对象,分配到老年代

     3.2 不是大对象

4.分配到TLAB,TLAB其实就是Eden区

5. YGC回收之后,大多数的对象会被回收(90%),活着的进入s1

6. 再次YGC,活着的对象eden + s1 -> s2

7. 第六步、第七部循环,按照时间进行YGC

8. 年龄足够 进入 老年代 (15 CMS 6)

9. 老年代都是顽固分子,等老年代满了进行FGC

2. 什么是逃逸分析

1.为什么要分配在栈上?

通过JVM内存模型中,我们知道Java的对象都是分配在堆上的。当堆空间(新生代或者老年代)快满的时候,会触发GC,没有被任何其他对象引用的对象将被回收。如果堆上出现大量这样的垃圾对象,将会频繁的触发GC,影响应用的性能。其实这些对象都是临时产生的对象,如果能够减少这样的对象进入堆的概率,那么就可以成功减少触发GC的次数了。我们可以把这样的对象放在栈上,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。

2.什么情况下会分配在栈上?

为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象会不会被外部访问。如果不会逃逸可以将该对象在栈上分配内存。随栈帧出栈而销毁,减轻GC的压力

3.什么是逃逸分析

逃逸分析:就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,

如果没有被外部的方法使用,那么就建议在栈中分配一块内存空间,用来存储临时的变量。

如果被外部的方法引用了,那就在堆上分配内存空间,实现共享。

JDK 1.6就已经使用逃逸分析了。

3.什么是大对象

大对象就是需要大量连续内存空间的对象(比如:字符串、数组)。

4.什么是TLAB

什么是TLAB呢?本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。简单说,TLAB是为了避免多线程争抢内存,在每个线程初始化的时候,就在堆空间中为线程分配一块专属的内存。自己线程的对象就往自己专属的那块内存存放就可以了。这样多个线程之间就不会去哄抢同一块内存了。这是一块每个线程私有的内存分配区域,它存在于Eden区,TLAB空间的内存非常小,仅占有整个Eden空间的1%。jdk8默认使用的就是TLAB的方式分配内存。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。Java语言对内存管理做了自己的优化,这就是垃圾回收机制。Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由GC(garbage collection)负责自动回收不再使用的内存。     上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道GC在什么时候回收内存对象,什么样的内存对象会被GC认为是“不再使用”的。     Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小张自由—>张有博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值