堆内存
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
Java的堆区主要分为三个区:年轻代(New Generation)、年老代(Old Generation)、持久代(Tenured Generation)
①年轻代(New Generation):对象被new后一般被放置在年轻代中,经过一定的Young GC(针对年轻代的内存回收,也成为Minor GC)还活着的对象就会被移动到年老代。
PS:年轻代一般被分为三个区,1个Eden区,2个Survivor区。大部分对象在Eden区中生成,当Eden区满的时候,还存活的对象被复制到其中的一个Survivor区中,当一个Survivor区满时,此区存活的对象将被复制到另外一个Survivor区中,当该Survivor区也满时,从前一个Survivor区复制过来的并且此时还存活的对象,将可能被复制到年老代。
②年老代(Old Generation):在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。针对年老代的垃圾回收即 Full GC
③持久代(Tenured Generation):持久带中主要存放用于存放静态类型数据,如 Java Class, Method 等, 与垃圾收集器要收集的Java对象关系不大。
这样划分的目的是为了JVM能够更好地管理堆内存中的对象,包括内存的分配以及回收。
GC堆
Java 中的堆也是 GC 收集垃圾的主要区域。GC 分为两种:Minor GC(Young GC)、Full GC
①Minor GC 是发生在年轻代(新生代)中的垃圾回收动作,所采用的是复制算法。
Java对象申请个内存以及存放都处于新生代,Java中大部分对象通常不需要永久的存活,当一个对象被判定为死亡的时候,GC就有责任来回收这部分对象所占用的内存空间,新生代是GC回收的频繁区域。当对象在 Eden ( 包括其中一个 Survivor 区域 ) 出生后,在经过一次 Young GC(Minor GC) 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳,则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域中,然后清理所使用过的 Eden 以及 Survivor 区域。
②Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。
标记-清除算法即是一快区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出标记-整理算法,多了碎片的整理,整理出更大的内存来存放更大的对象。