当new 一个对象时,该对象首先进入eden(伊甸园,人类初始的住处),在没有GC触发时该对象是不会移动的。每当通过一次GC,那么该对象的年龄就会加1,还有那些不可达的对象就会被销毁,eden也会被清空。此时对象应该被移动到存活区(s0/s1)中,仍是在年青代的范围中。并在存活区中不断爬升它的年龄,当它的年龄达必定值时,该对象就是被移动到老年代中(叫“晋升”),清空s0/s1的对象。
当转到大对象,或eden/s0/s1的空间太小,对象就会被直接移动到老年代中。
-XX:MaxTenuringThresold //最大晋升年龄,默认15。
参数说明:当到了这个年龄的对象必定会被移动到老年代中,但未到这个年龄也有可能被移动到老年代中,由jvm自行判断。
-XX:TargetSurvivorRatio50 //指当存活区(s0/s1)的使用率到达50%时,不管对象是否到地最大晋升 年龄都会被移动到老年代中
-XX:PretenureSizeThreshold1024 //指当对象的大小超过1M就会被直接送到老年代中,只在串行与 ParNew中有效,对于ParallelGC无效。默认0,不指定 java
TLAB区域(Thread Local Allocation Buffer 线程本地分配缓存)
这是为了加速线程对象分配而生的。通常状况下对象会分配在堆上,而堆是全局共享的。就会发生一时间可能有多个线程在堆上去申请空间,激烈的竞争致使分配效率降低。考虑到对象分配是java最经常使用的操做,所以jvm提供了TLAB来提交分配效率,而TLAB自己占用了eden空间。 缓存
-XX:-UseTLAB //禁用TLAB,这样会致使性能降低,默认开始。
-XX:-ResizeTLAB //禁用自动调整TLAB的大小,默认开启
-XX:TLABSize //手工指定一个TLAB的大小,在禁用自动调整的前提下
-XX:+PrintTLAB //查看TLAB的使用状况
-XX:TLABRefillWasteFraction64 //指当TLAB空间不足,且当请求分配的对象大小,小于1/64的TLAB 时建立一个新的TLAB,不然分配到堆中
jvm