私下记录一下面试遗忘的问题;
全称:垃圾分代回收机制。JVM内存(运行时数据区)划分了5个区域,分别是:
1.栈:存放一个个对应方法的栈帧
2.堆:储存的是容器和对象
3.程序计数器(寄存器):当前线程所执行的字节码的行号指示器
4.本地方法栈:为虚拟机使用到的本地方法服务
5.方法区:储存类信息,常量,静态常量以及编译器编译后的代码等
而垃圾分代回收机制针对的是堆内存。
Java中的美中数据类型都是确定的,所有的内存都是由Java自己分配,也就是说内存的管理和回收也是java自己进行的。在Java中一带产生内存问题程序员是无法处理的。所以理论上正常情况下Java的堆内存是足够使用的,当堆内存使用的负荷量超过一定的限度(一般情况下时70%)时,会启动垃圾回收器(Garbage Collector——GC)进行堆内存的回收释放。
分代是指堆内存又分新生代(Young Generation)和老年代(Old Generation),新生代又分为伊甸区(eden)和幸存区(surivivor),幸存区由from space与to space两块相等的内存区域组成。eden:from:to = 8:1:1。
对象在刚创建的时候是存在伊甸区的;如果在伊甸区经过一次回收后依然存在,那么会将它挪到幸存区去,在幸存区经历的多次回收后这个对象依然存在,则会将其挪到老年代。在回收的时候会先回收新生代,如果新生代回收之后内存足够使用则不扫描老年代,否则也会扫描老年代。老年代的扫描频率低于新生代。
发生在新生代的回收:Minor GC
发生在老年代的回收:Major GC
对象创建后会先存放在新生代伊甸区,经过一次回收后移入新生代幸存区;在经过多次(一般为15次,可调整)回收后,移入老年代;如果老年代内存不足触发Major回收后该依然无法放开该对象(对象的保存),则会报OutOMemryError。