理解Java垃圾回收算法

内存区域

Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。

image

具体参考:Java内存区域与内存溢出

常用的垃圾回收算法:

  • 引用计数算法:

    给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值为0 的对象就是不再被使用的,垃圾回收器将收回该对象所使用的内存。
    引用计数算法实现简单,效率很高,微软的COM技术、ActionScript、Python等都使用了引用计数算法进行内存管理,但是引用计数算法对于对象之间相互循环引用问题难以解决,因此java并没有使用引用计数算法。
  • 根搜索算法:

    通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
    主流的商用程序语言C#、java和Lisp都使用根搜素算法进行内存管理。
    在java语言中,可作为GC Root的对象包括以下几种对象:
    a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。
    b.方法区中的类静态属性引用的对象。
    c.方法区中的常量引用的对象。
    d.本地方法栈中JNI本地方法的引用对象。

Java中使用的垃圾回收算法:

  1. 引用计数法:缺点是无法处理循环引用问题
  2. 标记-清除法:标记所有从根结点开始的可达对象,缺点是会造成内存空 间不连续,不连续的内存空间的工作效率低于连续的内存空间,不容易分配内存
  3. 复制算法:将内存空间分成两块,每次将正在使用的内存中存活对象复制到未使用的内存块中,之后清除正在使用的内存块。算法效率高,但是代价是系统内存折半。适用于新生代(存活对象少,垃圾对象多)
  4. 标记-压缩算法:标记-清除的改进,清除未标记的对象时还将所有的存活对象压缩到内存的一端,之后,清理边界所有空间既避免碎片产生,又不需要两块同样大小的内存快,性价比高。适用于老年代。
  5. 分代
    详细内容参考: 深入理解java垃圾回收算法
    参考:深入理解 Java 垃圾回收机制
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供...
    简欲明心阅读 90,135评论 17 311
  • 《深入理解Java虚拟机》笔记_第一遍 先取看完这本书(JVM)后必须掌握的部分。 第一部分 走近 Java 从传...
    xiaogmail阅读 10,668评论 1 34
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,473评论 11 349
  • 最近青萝卜开始上市了,脆脆甜甜的很是爽口,每到这个时节总是会买几个回来吃的。 众所周知,青萝卜的头是可以切下来做盆...
    谭惜言阅读 5,115评论 0 2
  • 我告诉自己,没那么爱你 眼睛却不禁随你转动 我告诉自己,没那么爱你 心跳却因你改变频率 我告诉自己,没那么爱你 却...
    肆酒漆阅读 1,859评论 0 0