年轻代与老年代
- 存储咋在JVM中的Java对象可以被划分为两类:
- 一类是生命周期较短的瞬时对象,这类对象的创建和消亡非常迅速
- 另一类对象的生命周期确非常长,在某种极端的情况下还能够与JVM生命周期保持一致
- Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(OldGen)
- 其中年轻代又可以划分为Eden空间和Survivor0空间和Survivor1空间(有时也叫做from区和to区)
- 配置新生代于老年代在对结构的占比:
- 默认-XX: NewRatio=2,表示新生代占1,老年代占2。新生代占整个堆的1/3
- 也可以修改-XX: NewRatio=4,表示新生代占1,老年代占4。新生代占整个堆的1/5
- 在HotSpot中,Eden空间和另外两个Survivor空间缺省所占比例是8:1:1
- 开发人员可以通过JVM参数选项:-XX: SurvivorRatio调整这个空间比例。比如: -XX: SurvivorRatio=8
- 几乎所有的Java对象都是在Eden区被new出来的
- 绝大多部分的对象的销毁都是在新生代中进行的
- 可以使用-Xmn设置新生代最大内存大小
对象分配过程:概述
为新对象分配内存是一件非常严谨和麻烦的事情,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法和内存回收算法密切相关,所以还需要GC执行完内存回收之后是否在内存空间产生碎片
- new的对象先放在伊甸园区,此区域有大小限制
- 当伊甸园空间填满时,程序又需要创建对象,JVM垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园中的不在被其他对象引用的对象进项销毁。再加载新的对象放到伊甸园
- 然后将伊甸园中的剩余的对象移动的幸存者0区
- 如果再次出发GC,此时上次幸存下来的放到幸存者0区的,没有被回收的对象就会被移动到幸存者1区
- 如果再次经历垃圾回收,此时会重新放回幸存者和0区,接着这次去幸存者1区
- 啥时候能去养老区?可以设置次数,默认是:15此
- 可以设置参数:-XX:MaxTenuringThreshold=<N>进行设置
总结
- 针对幸存者S0和S1区的总结:复制之后有交换,谁空谁是To
- 关于垃圾回收:频繁在新生代收集,很少在养老区收集,几乎不在永久代(元空间)收集