JVM内存分配-逃逸分析、碰撞指针和TLAB详解
2023-04-29 来源:飞速影视
1.逃逸分析
在方法体中创建对象,如果该对象被方法体其他变量引用到,叫方法逃逸,被外部线程访问到叫线程逃逸。JVM如果开启了逃逸分析,JIT会对代码进行如下优化:
同步省略(锁消除),没有逃逸,则直接消除锁。
将堆分配转化为栈分配,栈上分配就是把方法中的变量和对象分配到栈上,方法执行完后栈自动销毁,而不需要垃圾回收的介入,从而提高系统性能。
分离对象或标量替换,原始数据类型(int,long等数值类型以及reference类型等)不能再进一步分解,称为标量。相对的,如果一个数据可以继续分解,那它称为聚合量,Java中最典型的聚合量是对象。如果逃逸分析证明一个对象不会被外部访问,并且这个对象是可分解的,那程序真正执行的时候将可能不创建这个对象,而改为直接创建它的若干个被这个方法使用到的成员变量来代替。拆散后的变量便可以被单独分析与优化, 可以各自分别在栈帧或寄存器上分配空间,原本的对象就无需整体分配空间了。
逃逸分析开关参数:
-XX: DoEscapeAnalysis :表示开启逃逸分析
-XX:-DoEscapeAnalysis :表示关闭逃逸分析 从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis
锁消除开关参数:
-XX: EliminateLocks开启锁消除(jdk1.8默认开启,其它版本未测试)
-XX:-EliminateLocks 关闭锁消除
锁消除基于分析逃逸基础之上,开启锁消除必须开启逃逸分析
2.指针碰撞
堆内存被一个指针一分为二,指针的左边都被塞满了对象,指针的右变是未使用的区域。每一次有新的对象创建,指针就会向右移动一个对象size的距离。这就被称为指针碰撞。如下图所示:
这里会存在两个问题,第一个问题:已用区域会随着垃圾收集,出现大量的碎片。第二个问题:如何解决并发。
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号