![]() 1 对象创建在hotspot vm中,有两个方式来提升申请内存空间的速度,分别是bumo the pointer 突出指针“以及”TLABS(Thread-Local Allocation Buffers)“ 1.1 BTPBTP总是指向最后创建的对象地址,这样当有新的对象需要创建的时候,只需要计算总的和最后一个就能得出可用空间,如果足够,则申请空间,并且移动BTP 1.2 TLAB对象内存的创建在单线程下比较简单,但是在多线程环境下,需要线程安全的操作,那就必须使用锁,这样在高并发下,性能就会有巨大的下降,TLAB就是为了解决这种情况,他为每个线程划分一段较小的空间,这样在整个堆上就不会有冲突,并且也不必使用同步或者某些原子操作来保证线程安全。这种模式下每个tlab区的大小,主要受限于几个参数:线程数,申请空间的频率,堆大小,在java7中,为了考虑这些因为,tlab部分已经有几千行的代码,及其复杂 1.3 HAB每个区太大,或者线程数太多,都会使得产生过多的碎片,这回导致更多的gc产生,实际上还是影响性能,现在有一种分层分配缓存(hierarchical allocation buffers),可以参考 TLAB类似于2层的结构,即heap和tlabs,在HAB中,分为了4(3)层,heap,process,core,thread PLAB是为多核处理器准备的,线程跑在不同核,但是相同处理器的情况下,共享PLAB;CLAB是给核分配的,在相同核上的线程共享CLAB;PLAB和CLAB都应该是TLAB的整数倍,来避免碎片;访问流程如下:根据线程当前所在的处理器以及核,在这个PLAB以及CLAB下申请空间 这种方式明显的好处就是可以线程的多少不会有太多的影响,也不用考虑太多的TLAB的大小,一般申请较大的PLAB和CLAB,较小的TLAB即可 Hierarchical PLABs, CLABs, TLABs in Hotspot 因为TLAB的方式受到线程数的限制,过小会降低效率,过大容易造成浪费;按照分层的设计模型,分为处理器(process),核(core),线程(Thread)的方式划分空间,这种方式不受限于线程数,一般只要分配较大的PLAB,CLAB,以及较小的TLAB即可 |
|