Java对象内存分配流程

x33g5p2x  于2022-08-17 转载在 Java  
字(1.1k)|赞(0)|评价(0)|浏览(266)

Java对象内存分配流程

  1. 流程介绍

2. 什么是逃逸分析

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

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

3.什么是逃逸分析

3.什么是大对象

4.什么是TLAB

Java对象内存分配流程

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的方式分配内存。

相关文章