揭开JVM中TLAB中的神秘面纱

云计算 虚拟化
在开始文章之前,我这里暂且认为大家已经明白了JVM创建对象分配内存地址的流程,也知道JVM内存划分。基于人道主义我还是放一张图吧,大家对照着看。

[[413891]]

本文转载自微信公众号「一个程序员的成长」,作者一个程序员的成长。转载本文请联系一个程序员的成长公众号。

在开始文章之前,我这里暂且认为大家已经明白了JVM创建对象分配内存地址的流程,也知道JVM内存划分。基于人道主义我还是放一张图吧,大家对照着看。

JVM内存结构

堆内存划分结构

堆区分配内存是否存在多线程安全问题?

答:可能存在;

new Object();

上述操作我们都知道它最终需要在堆内存中开辟一块内存空间,那么想这么一个问题,堆区是所有线程共享的,那么在JVM频繁创建对象的时候,并发情况下在堆内存中开辟空间是不是存在安全问题。

那么为了解决这个问题我们首先想到的就是加锁,但是加锁存在一个问题,就是影响性能。

TLAB出现(Thread Local Allocation Buffer)

基于上面的问题,从而引出了TLAB,强行翻译一下就是线程本地分配缓冲区,首先呢先看张图

声明:在堆内存中分配空间,首先是在eden区进行分配,并不是直接分配在老年代,内存分配结束之后,没进行一次Yong GC,如果对象没有被回收,那么他的存活次数就会 +1,如果这个次数达到15次,那么这个对象晋升到老年代。

那么我们知道了对象分配首先是在eden区进行的,那么也不难理解上面的图,我们在eden区域划分出来一块区域,我们称之为TLAB,每一个TLAB都是现成私有的,那么并发创建对象的时候其实也就不需要进行加锁这样的操作了,这样现成安全问题就解决了。

如果分配的这些TLAB空间被使用完了或者对象所需要额内存空间大于TLAB所能提供的空间,那么只能在公用的eden区或者老年代分配内存空间了。

总结

  • 1、JVM首选TLAB进行内存空间的分配;
  • 2、TLAB占用整个eden区域的1%,这个值也可以通过参数自定义;

 

通过这个问题也可以推理出另外一个问题,堆区在严格意义上说不是线程共享的。

 

责任编辑:武晓燕 来源: 一个程序员的成长
相关推荐

2015-08-20 13:43:17

NFV网络功能虚拟化

2010-05-26 19:12:41

SVN冲突

2021-06-07 08:18:12

云计算云端阿里云

2010-05-17 09:13:35

2014-03-12 11:11:39

Storage vMo虚拟机

2013-07-19 14:35:59

iOS中BlockiOS开发学习

2013-07-19 14:00:13

iOS中BlockiOS开发学习

2018-03-01 09:33:05

软件定义存储

2009-06-01 09:04:44

Google WaveWeb

2024-08-15 08:56:18

2023-11-02 09:55:40

2016-04-06 09:27:10

runtime解密学习

2009-09-15 15:34:33

Google Fast

2016-11-16 09:06:59

2024-02-14 09:00:00

机器学习索引ChatGPT

2010-05-11 10:19:17

VMforceJava云计算

2011-08-02 08:59:53

2021-08-11 09:01:48

智能指针Box

2017-10-16 05:56:00

2010-06-17 10:53:25

桌面虚拟化
点赞
收藏

51CTO技术栈公众号