栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

垃圾收集器与内存分配策略

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

垃圾收集器与内存分配策略

Java 和 C++ 的一个区别就是 Java 可以进行内存动态分配和垃圾收集。垃圾收集技术实际上早于 Java 诞生,垃圾收集主要完成三件事情:哪些内存需要回收?什么时候回收?如何回收?

1. 判断对象是否存活

Java 的垃圾收集主要是在堆上,Java 堆里几乎存放着所有的 Java 对象实例,垃圾收集器在对堆进行回收前,第一件事就是要确定对象是否存活。

  • 引用计数法

    给对象添加一个引用计数器,每当有一个地方引用它,计数器值加1,引用失效时计数器值减1,当计数器值为0时说明这个对象不再被使用。

    引用计数算法实现简单,判定效率也很高,在大部分情况下是一个不错的算法,例如微软公司的 COM (Component Object Model)技术、使用 ActionScript 3 的 FlashPlayer、Python 语言和在游戏脚本领域被广泛应用的 Squirrel 中都使用了引用计数算法进行内存管理。

    但是主流的 Java 虚拟机没有选择使用引用计数法来管理内存,主要原因是它很难解决对象之间循环引用的问题。

  • 可达性分析算法

    以**“GC Roots”**作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,证明此对象是不可用的。

    如图所示,对象 object 5、object 6、object 7 虽然互相有关联,但是它们到 GC Roots 是不可达的,所以它们将会被判定为是可回收的对象。

    在 Java 中,可作为 GC Roots 的对象包括下面几种:

    • 在虚拟机栈(栈帧中的本地变量表)中引用的对象。
    • 方法区中类静态属性引用的对象。
    • 方法区中常量引用的对象。
    • 本地方法栈中 JNI (即 Native 方法)引用的对象。
2. Java 中的引用

在引用计数法和可达性分析法中,判定对象是否存活都与“引用”有关。

在 JDK 1.2以前,Java 中对引用是这样定义的:如果 reference 类型的数据中存储的数值代表的是另一块内存的起始位置,就称这块内存代表着一个引用。这种定义纯粹但是过于狭隘,一个对象在这种定义下只有被运用或没有被引用两种状态。

在 JDK 1.2之后,Java 对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。