java基础篇之GC

文章目录

概述

java和C++有着一堵 内存动态分配 和 垃圾收集技术 围成的“高墙”,外面的人想进去,里面的人想出来。

java垃圾回收

GC(Garbage Collection) 的历史比java还要久远,1960年诞生的Lisp语言当时就在考虑三个问题:

  1. 哪些内存需要回收
  2. 什么时候回收
  3. 如何回收
  • 对于java来说,包括程序计数器,栈内存 ,他们随线程生,随线程灭,方法结束后内存也就回收了(内存泄漏后面在讨论);
  • 堆内存就不同了,一个接口的多个实现类可能需要的内存不同,一个方法的多个分支需要的内存也可能有区别,我们只有在程序运行的时候才知道创建了哪些对象,这部分的内存分配和回收都是动态的。所以堆是我们主要分析的区域。
    下面来回答上面的三个问题
  1. 哪些内存需要回收
    已经“死掉”的对象,需要回收,所以垃圾收集器的第一件工作就是区分哪些对象还在存活。一般有两种策略
    ①引用计数算法, 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。该方法实现简单,效率高,但是它很难它很难解决对象之间相互循环引用的问题。所以,大多数jvm判断对象是否存活基本并没有采取该方法。
    ②可达性分析算法
    java基础篇之GC