分享

6.GC指对象的创建

 碧海山城 2012-12-19

 

对象创建

hotspot vm中,有两个方式来提升申请内存空间的速度,分别是bumo the pointer 突出指针以及TLABS(Thread-Local Allocation Buffers)

1.1 BTP

BTP总是指向最后创建的对象地址,这样当有新的对象需要创建的时候,只需要计算总的和最后一个就能得出可用空间,如果足够,则申请空间,并且移动BTP


1.2 TLAB

对象内存的创建在单线程下比较简单,但是在多线程环境下,需要线程安全的操作,那就必须使用锁,这样在高并发下,性能就会有巨大的下降,TLAB就是为了解决这种情况,他为每个线程划分一段较小的空间,这样在整个堆上就不会有冲突,并且也不必使用同步或者某些原子操作来保证线程安全。这种模式下每个tlab区的大小,主要受限于几个参数:线程数,申请空间的频率,堆大小,在java7中,为了考虑这些因为,tlab部分已经有几千行的代码,及其复杂

使用PrintTLAB后的日志解释

1.3 HAB

每个区太大,或者线程数太多,都会使得产生过多的碎片,这回导致更多的gc产生,实际上还是影响性能,现在有一种分层分配缓存hierarchical allocation buffers,可以参考


TLAB类似于2层的结构,即heaptlabs,在HAB中,分为了43)层,heapprocesscorethread

PLAB是为多核处理器准备的,线程跑在不同核,但是相同处理器的情况下,共享PLABCLAB是给核分配的,在相同核上的线程共享CLABPLABCLAB都应该是TLAB的整数倍,来避免碎片;访问流程如下:根据线程当前所在的处理器以及核,在这个PLAB以及CLAB下申请空间

这种方式明显的好处就是可以线程的多少不会有太多的影响,也不用考虑太多的TLAB的大小,一般申请较大的PLABCLAB,较小的TLAB即可


Hierarchical PLABs, CLABs, TLABs in Hotspot


因为TLAB的方式受到线程数的限制,过小会降低效率,过大容易造成浪费;按照分层的设计模型,分为处理器(process),核(core),线程(Thread)的方式划分空间,这种方式不受限于线程数,一般只要分配较大的PLAB,CLAB,以及较小的TLAB即可

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多