Java引用类型之 :引用简介

2019-07-15  本文已影响0人  贪睡的企鹅

1 内存回收

每一个Java程序中的对象都会占用一定的计算机资源,最常见的,如:每个对象都会在堆空间上申请一定的内存空间。但是除了内存之外,对象还会占用其它资源,如文件句柄,端口,socket等等。当你创建一个对象的时候,必须保证它在销毁的时候会释放它占用的资源。否则程序将会在OOM中结束它的使命。

在Java中数据内存分配发生在栈和堆中,对于栈中的变量(引用类型,基本类型)会在方法的退出时自动释放,对于new出来对象分配到堆中,不需要程序员来管理内存的分配和释放,Java有自动进行内存管理的神器——垃圾回收器,垃圾回收器会自动回收那些不再使用的对象。那如何判断对象不再使用呢?就是不在被引用的对象。

2 如何判断对象已死

引用计数法

给对象添加一个引用计数器,每当该对象被引用,它的计数器值就+1;当引用实效时,计数器就-1;在任何情况下,当计数器值为0时,就表示该对象不再被使用。

缺点:它很难解决对象之间相互引用,引起的循环引用问题,会产生无法被释放的内存区域。因此,主流的JVM都没有选用引用计数法来管理内存。

可达性分析算法

主流的JVM基本都使用可达性分析算法来判断对象是否存活,通过一系列“GC Roots”的对象作为起始点向下搜索,搜索所走过的路径为引用链,当一个对象没有任何引用链与GC Roots相连,代表该对象不再被使用,将其判定为可回收的对象

image

3 GCROOT

4 引用类型

最早的JDK中只存在一个引用类型,这样就对于垃圾收集器来说所有的引用对象回收都是平等的。这样对于开发人员来说无法把控对象回收时机,所有对象回收都交给了垃圾收集器

为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用、软引用、弱引用、虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使用不同的处理方式。

这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

上一篇下一篇

猜你喜欢

热点阅读