本文介绍: 为了保证Java对象的内存分配的安全性,同时提升效率,每个线程在Java堆中可以预先分配一小块内存,这部分内存称之为TLAB(Thread Local Allocation Buffer),这块内存的分配时线程独占的,读取、使用、回收是线程共享的。可以通过设置-XX:+/-UseTLAB参数来指定是否开启TLAB分配。
背景
了解垃圾回收器,除了要知道垃圾回收器的工作原理,我们还要想一个问题,垃圾回收器的垃圾是怎么产生的。所以本期我们讲解一些垃圾回收器的对象内存分配原则。结合这些分配原则,帮助大家在面试时能更好的和面试官吹牛皮。
分配规则
先说一个大的原则,一般的对象会被分配在新生代Eden区,然后经过垃圾回收存活一定时间后进入老年代。这个原则也符合我们的对内存的分带收集理论。但是并不绝对,有一些特例。下面我将讲解这些特例。
大对象直接进入老年代
所谓大对象,就是指很长的字符串或者元素众多的数组。大对象的分配需要连续的内存空间,如果直接分配在新生代,那么在新生代垃圾回收时需要反复的拷贝这个对象,而反复的大内存的拷贝会严重影响GC性能。实际上,垃圾回收过程里,最耗时的就是内存的拷贝过程。所以为了避免这个问题,JVM要求超过一定容量的对象直接分配在老年代,使用参数-XX:PretenureSizeThreshold设置,这个参数的单位是字节数。
长期存活的对象直接进入老年代
当对象经过一定的生存周期,那么对象就可以从新生代晋升为老年代,这个规则是显而易见的,JVM默认是存活15次GC的对象会晋升老念叨。可以使用JVM参数-XX:MaxTenuringThreshold设置
动态年龄
我们知道JVM是很”聪明”的,能够自适应的调节一些参数。对象晋升老年代也是,如果一次S区中,某个年龄的对象占据S区的一半,那么年龄大于等于该年龄的对象,直接晋升老年代。
内存分配担保
所谓内存担保,是指在老年代预留出内存保证新生代的垃圾回收能够进行。
Java对象的内存分配
TLAB
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。