前提了解:
java 内存分五部分:
堆(存放new 对象)、JVM方法栈(执行方法)、
本地方法栈(执行本地方法)、方法区(存放类信息,存放方法)、程序计数器
=========================================================================
1:垃圾回收,首先确认有哪些是垃圾
java内存中的五部分,栈中的数据随着方法进行压栈出栈,程序计数器占用少量的内存空间;所以就剩堆、方法区中
垃圾需要解决。
判断堆内存中new对象是否是垃圾?
采用可达性分析,从栈、方法区出发,如果一个对象在栈、方法区中都没有被引用的话,那么就认为这个对象为垃圾对象。
判断方法区中的类、常量是否是垃圾?
实例对象都已经回收;加载该类的ClassLoader回收;类对应的对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法,那么就认为该类为垃圾类。
2:其次,垃圾回收算法都有哪些
采用分类回收算法,包含复制算法(适合少量对象存活)、整理回收算法(适合大量对象存活)
new的对象首先都放在年轻代内存中,其中年轻代分eden、survivor、survivor三部分,采用复制算法;对象在eden区中生成,当eden区内存满时,还存活的对象将复制到survivor区,当这个survivor区满时,次区的存活的对象将被复制到另外一个survivor区,如果这个survivor区也满时,就将从第一个survivor区复制过来的并且还存活的对象复制到老年代。
老年代中采用整理回收算法