一、分配原理
当执行创建对象操作时,首先进行逃逸分析(其实就是该对象是否会被外部方法所引用(就是作用域),若不会则进行标量替换(就是对象中成员变量是基本数据类型的在栈帧/寄存器中进行创建),可以分担堆内存压力,毕竟出栈就会销毁);若逃逸分析不通过则进行大对象(参数:“-XX:PretenureSizeThreshold”)判断;若判断通过则直接进入老年代,若不通过则进行TLAB(Thread Local Allocation Buffer,即线程本地分配缓存区,就是向eden区申请一块很小的内存空间(线程私有的)来存放对象),若大小足够存放该对象则存放,若不够则直接在eden区中进行创建;当eden区满后,会进行Minor GC,存活对象会进入Survivor区,其他对象会由垃圾回收线程进行回收;判断对象年龄是否等于15(默认值为15,设置参数“-XX:MaxTenuringThreshold”),或者当前存放存活对象的Survivor区域的年龄1+年龄2+。。。+年龄n>Survivor内存大小的50%,则对象直接进入老年代。
二、原理图
小结
原理中涉及的知识点有:
- 逃逸分析;
- 对象优先在Eden区分配;
- 大对象直接进入老年代;
- 长期存活的对象将进入老年代;
- 动态对象年龄判断;
- 空间分配担保。
内存回收与垃圾收集器在很多时候都是影响系统性能、并发能力的主要因素之一,虚拟机之所以提供多种不同的收集器以及大量的调节参数,是因为只有根据实际应用需求,实现方式选择最优的收集方式才能获取最高的性能。没有固定收集器、参数组合,也没有最优的调优方法,虚拟机也就没有什么必然的内存回收行为。因此,学习虚拟机内存知识,如果要到实践调优阶段,那么必须了解每个具体收集器的行为、优势和劣势、调节参数。
|