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