JVM——堆


 
 
 “-Xms"用于表示堆区的起始内存,等价于-XX : InitialHeapsize“
 -Xmx"则用于表示鞫区的最大内存,等价于-XX:MaxHeapsize“
年轻代与老年代
对象分配的过程

我们会有一个年龄计数器为存放的对象计数,(from和to区)谁空谁是to区
幸存者区内存满时不会触发YGC,而伊甸园区满的时候触发YGC会将幸存者区一起回收,所有幸存者区属于被动回收。

 流程:

 
 
 
 为什么需要把Java堆分代?不分代就不能正常工作了吗?
 因为在创建对象完之后,有很多对象都是朝生夕死的,如果我们把生命周期长的对象放在一起,那么我们GC垃圾处理就要从中大范围的搜索无用对象进行回收,这大大降低了效率,如果进行分区,我们就会先让GC先直接找无用对象的区域,这样就能大大提高效率。
内存分配策略(或对象提升(Promotion)规则)

 
为对象分配内存:TLAB
为什么有TLAB ((Thread Local Allocation Buffer ) ?
什么是TLAB?
 为每个线程分配一个私有的缓存地址,并且这个地址是存在Eden区域中的,占Eden1%的内存。
尽管不是所有的对象实例都能够在TLAB中成功分配内存,但JVM确实是将TLAB作为内存分配的首选。
 -XX:UseTLAB”设置是否开启TLAB空间。
 
 先通过TLAB,看对象大小是否能分配,不能分配就交和Eden区。

 
 
 堆是分配对象存储的唯一选择吗?
 栈上分配:
 在这里插入图片描述
 
 二、同步省略
 
三、分离对象或标量替换。
 
 
 










