Java对象内存分配流程
2. 什么是逃逸分析
1.为什么要分配在栈上?
2.什么情况下会分配在栈上?
3.什么是逃逸分析
3.什么是大对象
4.什么是TLAB
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
通过JVM内存模型中,我们知道Java的对象都是分配在堆上的。当堆空间(新生代或者老年代)快满的时候,会触发GC,没有被任何其他对象引用的对象将被回收。如果堆上出现大量这样的垃圾对象,将会频繁的触发GC,影响应用的性能。其实这些对象都是临时产生的对象,如果能够减少这样的对象进入堆的概率,那么就可以成功减少触发GC的次数了。我们可以把这样的对象放在栈上,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。
为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象会不会被外部访问。如果不会逃逸可以将该对象在栈上分配内存。随栈帧出栈而销毁,减轻GC的压力
逃逸分析:就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,
如果没有被外部的方法使用,那么就建议在栈中分配一块内存空间,用来存储临时的变量。
如果被外部的方法引用了,那就在堆上分配内存空间,实现共享。
JDK 1.6就已经使用逃逸分析了。
大对象就是需要大量连续内存空间的对象(比如:字符串、数组)。
什么是TLAB呢?本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)。简单说,TLAB是为了避免多线程争抢内存,在每个线程初始化的时候,就在堆空间中为线程分配一块专属的内存。自己线程的对象就往自己专属的那块内存存放就可以了。这样多个线程之间就不会去哄抢同一块内存了。这是一块每个线程私有的内存分配区域,它存在于Eden区,TLAB空间的内存非常小,仅占有整个Eden空间的1%。jdk8默认使用的就是TLAB的方式分配内存。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/promsing/article/details/126232750
内容来源于网络,如有侵权,请联系作者删除!