如何做统计信息的网站,wordpress 未通过审核应用,html网页设计实验总结,微信小程序saas平台好久#xff0c;好久....没有更博客了。这一次利用闲暇时间#xff0c;来扯一下关于JVM中的TLAB。什么是TLAB#xff1f;它是干什么的#xff1f;咋们先抛开这个问题#xff0c;一切的开始得从new对象到指针碰撞开始讲起。new对象与指针碰撞new对象怎么就出问题了呢#…好久好久....没有更博客了。这一次利用闲暇时间来扯一下关于JVM中的TLAB。什么是TLAB它是干什么的咋们先抛开这个问题一切的开始得从new对象到指针碰撞开始讲起。new对象与指针碰撞new对象怎么就出问题了呢java中我们要创建一个对象,用关键字new就可以了。但是在我们日常中有很多生命周期很短的对象。比如public void dome(){User usernew user();user.sayhi();}这种对象的作用域都不会逃逸出方法外也就是说该对象的生命周期会随着方法的调用开始而开始方法的调用结束而结束。假设JVM所有的对象都放在堆内存中(为什么用假设因为JVM并不是这样)一旦方法结束没有了指向该对象的引用该对象就需要被GC回收如果存在很多这样的情况对GC来说压力山大呀。那么什么又是指针碰撞呢假设JVM虚拟机上堆内存都是规整的。堆内存被一个指针一分为二。指针的左边都被塞满了对象指针的右变是未使用的区域。每一次有新的对象创建指针就会向右移动一个对象size的距离。这就被称为指针碰撞。图1.png好问题来了。如果我们用多线程执行刚才的dome方法一个线程正在给A对象分配内存指针还没有来的及修改同时为B对象分配内存的线程仍引用这之前的指针指向。这样就出现毛病了。(要注意的是上面两种情况解决方案不止一个我今天主要是讲TLAB其他方案自行查询)TLAB的出现我们现在已经搞清楚我们出现了哪些问题。我在为大家介绍一下今天的主角。TLAB的全称是Thread Local Allocation Buffer即线程本地分配缓存区这是一个线程专用的内存分配区域。如果设置了虚拟机参数 -XX:UseTLAB在线程初始化时同时也会申请一块指定大小的内存只给当前线程使用这样每个线程都单独拥有一个空间如果需要分配内存就在自己的空间上分配这样就不存在竞争的情况可以大大提升分配效率。TLAB空间的内存非常小缺省情况下仅占有整个Eden空间的1%也可以通过选项-XX:TLABWasteTargetPercent设置TLAB空间所占用Eden空间的百分比大小。TLAB的本质其实是三个指针管理的区域starttop 和 end每个线程都会从Eden分配一块空间例如说100KB作为自己的TLAB其中 start 和 end 是占位用的标识出 eden 里被这个 TLAB 所管理的区域卡住eden里的一块空间不让其它线程来这里分配。TLAB只是让每个线程有私有的分配指针但底下存对象的内存空间还是给所有线程访问的只是其它线程无法在这个区域分配而已。从这一点看它被翻译为 线程私有分配区 更为合理一点当一个TLAB用满(分配指针top撞上分配极限end了)就新申请一个TLAB而在老TLAB里的对象还留在原地什么都不用管——它们无法感知自己是否是曾经从TLAB分配出来的而只关心自己是在eden里分配的。TLAB的缺点事务总不是完美的TLAB也又自己的缺点。因为TLAB通常很小所以放不下大对象。1TLAB空间大小是固定的但是这时候一个大对象我TLAB剩余的空间已经容不下它了。(比如100kb的TLAB来了个110KB的对象)2TLAB空间还剩一点点没有用到有点舍不得。(比如100kb的TLAB装了80KB又来了个30KB的对象)所以JVM开发人员做了以下处理设置了最大浪费空间。当剩余的空间小于最大浪费空间那该TLAB属于的线程在重新向Eden区申请一个TLAB空间。进行对象创建还是空间不够那你这个对象太大了去Eden区直接创建吧当剩余的空间大于最大浪费空间那这个大对象请你直接去Eden区创建我TLAB放不下没有使用完的空间。当然又回造成新的病垢。3Eden空间够的时候你再次申请TLAB没问题我不够了Heap的Eden区要开始GC4TLAB允许浪费空间导致Eden区空间不连续积少成多。以后还要人帮忙打理。