简单介绍一下Java垃圾回收的机制,个人最近课程中介绍了这部分内容,便结合课件和网上资料做了简单的整理,思路主要依据学校介绍的思路,并不十分深入,这里简单介绍内存管理机制以便后面的理解。
Java内存管理:
1)对象在堆中申请。
2)对象的引用是指向对象的指针,一般是对象在堆中的首地址。
3)变量包含对象的引用。
4)每个对象可以包含变量和其他对象的引用。
5)一个引用至多指向一个对象,一个对象可以关联许多引用。
Java内存管理:
1)对象在堆中申请。
2)对象的引用是指向对象的指针,一般是对象在堆中的首地址。
3)变量包含对象的引用。
4)每个对象可以包含变量和其他对象的引用。
5)一个引用至多指向一个对象,一个对象可以关联许多引用。
Java采用垃圾自动回收机制,对于编程人员来说这无疑是一大便捷之处,理解其机制也有助于编写性能更好的程序。
介绍一下实体(entity)的概念:属性,参数,局部变量和结果等在代码中的名字。其值为对象或对对象的引用。
栈是方法调用和局部变量的存储之处,调用方法时进行压栈,得到结果后出栈,在出栈时自然而然地进行了内存回收(顺便感叹一下栈调用真的是极其伟大的创造),详情推荐阅读《深入理解计算机系统》。
对象存储在堆中,重点就在于对象的回收,
可达对象:根集合由root对象和局部变量构成,可达对象可以递归的定义为Reachable={N∈Obejects | (存在r∈Roots.r->N)∪(存在M∈Reachable.M->N)},简单来说,将所有对象视为一个有向图,通过根集合可以到达的对象即为可达对象。其余的全部为不可达对象。
可达对象需要保留,不可达对象需要回收。
复制算法:找出所有的可达对象,将其复制到另一个堆中,讲旧堆全部清空。
标记清除算法:在根集合开始,标记找出所有可达对象,将所有未标记的回收,已标记的清除标记。
标记压缩算法:在根集合开始,标记找出所有可达对象,将所有未标记的回收,已标记的清除标记并移到堆前面从而使堆连续减少碎片。
Java垃圾回收将堆划分成不同的区域(不同的generation ),以便GC可以更快地识别可以删除的对象,即young generation年轻带, old generation老年带, and permanent generation永久带。
新申请的对象将其放置在年轻带,垃圾回收时通常会发现大量死亡对象,采用复制算法,老年代则存活率较高,采用标记压缩或标记清除算法。
当三个空间中任何一个已满且存在空间需求时,都会发生垃圾回收,Minor GC针对年轻带,Minor GC后存活的对象提升至老年带,Full GC针对老年代和永久代,当没有空间提供给minor GC将对象提升到老年代中,或者永久代中无空间保存class元数据时。
介绍一下实体(entity)的概念:属性,参数,局部变量和结果等在代码中的名字。其值为对象或对对象的引用。
栈是方法调用和局部变量的存储之处,调用方法时进行压栈,得到结果后出栈,在出栈时自然而然地进行了内存回收(顺便感叹一下栈调用真的是极其伟大的创造),详情推荐阅读《深入理解计算机系统》。
对象存储在堆中,重点就在于对象的回收,
可达对象:根集合由root对象和局部变量构成,可达对象可以递归的定义为Reachable={N∈Obejects | (存在r∈Roots.r->N)∪(存在M∈Reachable.M->N)},简单来说,将所有对象视为一个有向图,通过根集合可以到达的对象即为可达对象。其余的全部为不可达对象。
可达对象需要保留,不可达对象需要回收。
复制算法:找出所有的可达对象,将其复制到另一个堆中,讲旧堆全部清空。
标记清除算法:在根集合开始,标记找出所有可达对象,将所有未标记的回收,已标记的清除标记。
标记压缩算法:在根集合开始,标记找出所有可达对象,将所有未标记的回收,已标记的清除标记并移到堆前面从而使堆连续减少碎片。
Java垃圾回收将堆划分成不同的区域(不同的generation ),以便GC可以更快地识别可以删除的对象,即young generation年轻带, old generation老年带, and permanent generation永久带。
新申请的对象将其放置在年轻带,垃圾回收时通常会发现大量死亡对象,采用复制算法,老年代则存活率较高,采用标记压缩或标记清除算法。
当三个空间中任何一个已满且存在空间需求时,都会发生垃圾回收,Minor GC针对年轻带,Minor GC后存活的对象提升至老年带,Full GC针对老年代和永久代,当没有空间提供给minor GC将对象提升到老年代中,或者永久代中无空间保存class元数据时。