首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何判断一个对象是否存活?GC对象的判定方法

如何判断一个对象是否存活?GC对象的判定方法

原创
作者头像
疯狂的KK
发布于 2023-07-12 06:37:49
发布于 2023-07-12 06:37:49
5520
举报
文章被收录于专栏:Java项目实战Java项目实战

推荐阅读

【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)

腾讯云玩转Stable Diffusion 模型-腾讯云开发者社区-腾讯云 (tencent.com)

引言

垃圾回收(Garbage Collection)是Java语言的一个重要特性,它可以自动管理内存释放和对象销毁的过程。在Java中,不再使用的对象被认为是垃圾,占用的内存将被回收,以便给其他对象使用。但是,如何确定一个对象是否是垃圾、是否存活,这是垃圾回收算法的关键问题。本文将介绍几种常见的GC对象判定方法,并给出相应的代码示例。

1. 引用计数法

引用计数法是一种简单的GC对象判定方法,它通过记录对象被引用的次数来判断对象是否存活。每当一个新的引用指向对象时,引用计数加1;当一个引用不再指向对象时,引用计数减1;引用计数为0时,对象被认为是不可达的,可以被回收。

然而,引用计数法存在一个严重的问题,即循环引用。当两个或多个对象之间存在相互引用时,即使它们与整个程序不可达,它们的引用计数也不会为0,导致这些对象永远无法被回收,从而引发内存泄漏。考虑以下示例代码:

代码语言:java
AI代码解释
复制
class A {
    private B b;

    public void setB(B b) {
        this.b = b;
    }
}

class B {
    private A a;

    public void setA(A a) {
        this.a = a;
    }
}

public class ReferenceCountingExample {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
    }
}

在上述代码中,对象ab相互引用,它们的引用计数永远不会为零,即使它们已经不再被程序所使用。

2. 可达性分析算法

为了解决引用计数法的缺陷,Java中常用的是可达性分析算法。可达性分析算法基于对象之间的引用关系来判断对象是否存活。

可达性分析算法的基本思路是:从GC Roots对象出发,遍历所有的引用链,被遍历到的对象则被认为是存活的,否则被认为是不可达的,可以被回收。

GC Roots对象包括下列几种情况:

  • 虚拟机栈中的引用对象(局部变量、方法参数)
  • 静态变量引用的对象
  • 常量引用的对象(如字符串常量池中的对象)
  • 本地方法栈中JNI(Java Native Interface)引用的对象

通过可达性分析算法,可以自动识别出循环引用时的对象不可达情况,从而预防内存泄漏。

下面是一个简单的Java代码示例,演示了可达性分析算法的应用:

代码语言:java
AI代码解释
复制
class A {
    private B b;

    public void setB(B b) {
        this.b = b;
    }
}

class B {
    private A a;

    public void setA(A a) {
        this.a = a;
    }
}

public class ReachabilityAnalysisExample {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);

        // 可达性分析
        a = null;
        b = null;

        // 执行垃圾回收
        System.gc();
    }
}

在上述示例代码中,通过给ab赋值为null,断开了ab之间的引用关系,使得它们变为不可可达的对象。当调用System.gc()触发垃圾回收时,GC会对不可达对象进行回收。

3. finalize()方法

在Java中,每个对象都拥有一个finalize()方法,该方法在对象被标记为不可达时,即将被回收前被调用。finalize()方法可以重写,并在其中执行一些清理操作。

以下是一个示例代码:

代码语言:java
AI代码解释
复制
class MyObject {
    private String name;

    public MyObject(String name) {
        this.name = name;
    }

    // 重写finalize()方法
    @Override
    protected void finalize() throws Throwable {
        System.out.println("Finalizing object: " + name);
    }
}

public class FinalizeMethodExample {
    public static void main(String[] args) {
        MyObject obj1 = new MyObject("Object 1");
        MyObject obj2 = new MyObject("Object 2");

        obj1 = null;
        obj2 = null;

        System.gc();
    }
}

在上述示例代码中,当obj1obj2变为不可达时,它们的finalize()方法将被调用,输出对应的清理信息。

需要注意的是,虽然finalize()方法提供了一种机会来进行对象的清理操作,但是不建议过度依赖该方法来释放资源。由于finalize()方法的调用时机不确定,有可能导致资源无法及时释放或造成性能问题。推荐使用显式资源释放的方式,例如在try-finally块中手动关闭IO流等。

4. 引用类型

此外,引用类型也是判断对象存活的一个重要因素。在Java中,有四种引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。

  • 强引用:通过new关键字创建的对象引用都是强引用,只要存在强引用指向一个对象,该对象就不会被回收。
  • 软引用:通过SoftReference类创建的对象引用属于软引用。当内存不足时,GC会根据需求回收软引用对象,以释放内存。
  • 弱引用:通过WeakReference类创建的对象引用属于弱引用。无论内存是否充足,一旦GC发现一个弱引用对象,就会立即将其回收。
  • 虚引用:通过PhantomReference类创建的对象引用属于虚引用。虚引用主要用于在对象被回收时收到系统通知,而不会对对象的生命周期造成影响。

下面是一个使用软引用的示例代码:

代码语言:java
AI代码解释
复制
import java.lang.ref.SoftReference;

public class ReferenceTypeExample {
    public static void main(String[] args) {
        String str = "Hello, World!";
        SoftReference<String> softRef = new SoftReference<>(str);
        
        str = null; // 释放强引用
        System.gc();

        System.out.println(softRef.get()); // 输出:Hello, World!
    }
}

在上述示例中,通过软引用softRef引用了字符串对象str。当将str的强引用释放后,调用System.gc()触发垃圾回收时,软引用对象softRef仍然可以通过get()方法获取到原始对象。

结论

判断一个对象是否存活是垃圾回收算法的关键问题。本文介绍了几种常见的GC对象判定方法,包括引用计数法、可达性分析算法和finalize()方法。在实际应用中,可达性分析算法是Java中最常用的判定方法,通过GC Roots对象出发,遍历引用链判断对象是否存活。此外,引用类型和其对应的引用级别也会影响对象的存活情况。通过合理使用GC对象判定方法,可以有效地管理内存,

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hive快速入门系列(7) | Hive常见的属性配置
  1. Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下。
不温卜火
2020/10/28
8980
Hive快速入门系列(7) | Hive常见的属性配置
常见的3种Hive参数配置方法
Hive提供三种可以改变环境变量的方法,分别是:(1)、修改${HIVE_HOME}/conf/hive-site.xml配置文件;(2)、命令行参数;(3)、在已经进入cli时进行参数声明。下面分别来介绍这几种设定。
挖掘大数据
2018/01/19
2.6K0
【Hive】Hive 的基本认识
Hive 是由 Facebook 开源的基于 Hadoop 的数据仓库工具,用于解决海量「结构化日志」的数据统计。
阿泽 Crz
2020/07/21
1.6K0
【Hive】Hive 的基本认识
hive 配置文件以及join中null值的处理「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115574.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/10
9420
hive基础总结(面试常用)
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 Metastore (hive元数据) Hive将元数据存储在数据库中,比如mysql ,derby.Hive中的元数据包括表的名称,表的列和分区及其属性,表的数据所在的目录 Hive数据存储在HDFS,大部分的查询、计算由mapreduce完成 Hive数据仓库于数据库的异同 (1)由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言, 再无类似之处。 (2)数据存储位置。 hdfs raw local fs (3)数据格式。 分隔符 (4)数据更新。hive读多写少。Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。 INSERT INTO … VALUES添加数据,使用UPDATE … SET修改数据 不支持的 HDFS 一次写入多次读取 (5) 执行。hive通过MapReduce来实现的 而数据库通常有自己的执行引擎。 (6)执行延迟。由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架 (7)可扩展性 (8)数据规模。 hive几种基本表类型:内部表、外部表、分区表、桶表 内部表(管理表)和外部表的区别: 创建表 外部表创建表的时候,不会移动数到数据仓库目录中(/user/hive/warehouse),只会记录表数据存放的路径 内部表会把数据复制或剪切到表的目录下 删除表 外部表在删除表的时候只会删除表的元数据信息不会删除表数据 内部表删除时会将元数据信息和表数据同时删除 表类型一、管理表或内部表Table Type: MANAGED_TABLE
用户1217611
2019/05/25
8700
大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型
  Hive:由Facebook开源用于解决海量结构化日志的数据统计(分析框架)。   Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 本质是:将HQL转化成MapReduce程序。
黑泽君
2019/03/08
9800
大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型
Hive中常用的一些配置操作(日志,显示等操作)
4.在HIve的 cli命令行上显示当前数据库,以及查询表的行头信息,在hive-site.xml文件下增加如下参数:
z小赵
2018/09/05
2.4K0
快速学习-Hive 安装
(3)修改 apache-hive-1.2.1-bin.tar.gz 的名称为 hive
cwl_java
2020/02/21
1.2K0
快速学习-Hive 安装
关于Hive命令的7个小技巧,你都清楚吗?
最近在看冰河大佬写的《海量数据处理与大数据技术实战》,该书涵盖以Hadoop为主的多款大数据技术框架实战的内容,兼顾理论与实操,是市面上难得的技术好书。本篇文章,我就分享一下从中学习到的关于Hive命令的7个小技巧,受益的朋友记得来发三连⭐支持一下哟~
大数据梦想家
2021/01/27
1.6K0
关于Hive命令的7个小技巧,你都清楚吗?
超实用干货!Hive 函数 + Shell编程的具体实践与运用
含义:connect to Hive Server on port number -hiveconf x=y Use this to set hive/hadoop configuration variables.
Wu_Candy
2022/07/05
7410
超实用干货!Hive 函数 + Shell编程的具体实践与运用
hive mapreduce reducer 调优
hive参数配置详情可查官方文档:Hive Configuration+Properties
大数据工程师-公子
2019/03/14
3.1K0
硬刚Hive | 4万字基础调优面试小总结
Hive是基于Hadoop的数据仓库工具,可对存储在HDFS上的文件中的数据集进行数据整理、特殊查询和分析处理,提供了类似于SQL语言的查询语言–HiveQL,可通过HQL语句实现简单的MR统计,Hive将HQL语句转换成MR任务进行执行。
王知无-import_bigdata
2021/06/01
2.1K0
硬刚Hive | 4万字基础调优面试小总结
Hive高级优化
1,FetchTask 不执行mapreduce,提高速度 设置的三种方式: 方法一: set hive.fetch.task.conversion=more; 方法二: bin/hive --hiveconf hive.fetch.task.conversion=more 方法三: 上面的两种方法都可以开启了Fetch任务,但是都是临时起作用的;如果你想一直启用这个功能,可以在${HIVE_HOME}/conf/hive-site.xml <property> <name>hive.fetch
Spark学习技巧
2018/01/31
1.4K0
安装和配置Hive
直接通过MapReduce来对存储在Hadoop HDFS上的数据进行查询和分析比较繁琐而且还需要编程。Hive是一个数据仓库系统,构建在HDFS之上,它提供了类似SQL的语法(HQL),可以将HQL翻译成MapReduce作业进行查询,使得对数据的管理和检索更为便利。
张子阳
2018/09/28
2K0
安装和配置Hive
《快学BigData》--Hive总结(C)(43)
Hive 总结 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 262
小徐
2019/08/05
9810
《快学BigData》--Hive总结(C)(43)
第五章 更换cdh版本,hive的安装使用,原理讲解
这里由于小编的这里在安装hive时,由于出现了启动hive时出现了和hadoop的版本不一致的原因,并且始终没有解决,所以就改变策略使用cdh版本的hadoop和hive.因为cdh版本的比较系统,兼容性好。因此要重新安装了。
全栈程序员站长
2022/08/05
1.5K0
第五章 更换cdh版本,hive的安装使用,原理讲解
hive安装配置(0.11版本)
1 假设Hadoop已经安装并配置正确,MySQL已经正确安装 2 为支持Hive的多用户多会话需求,需要使用一个独立的数据库存储元数据。   这里选择MySQL存储Hive的元数据,现在为Hive创建元数据库: mysql> create database hive; mysql> create user 'hive' identified by '123456'; mysql> grant all privileges on *.* to 'hive'@'%' with grant option; f
闵开慧
2018/03/30
7690
Hive常用参数调优十二板斧
hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能 hive.limit.row.max.size --- 设置最小的采样容量 hive.limit.optimize.limit.file --- 设置最大的采样样本数
王知无-import_bigdata
2020/12/08
3.5K0
Hive常用参数调优十二板斧
Hive参数调优
  大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。不过,有时Hive的输入数据量是非常小的。在这种情况下,为查询触发执行任务时消耗可能会比实际job的执行时间要多的多。对于大多数这种情况,Hive可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。
挽风
2021/04/13
1.7K0
Hive参数调优
Hive 0.13.1 on Hadoop2.2.0 + Oracle10g部署详解
http://mirrors.cnnic.cn/apache/hive/stable/apache-hive-0.13.1-bin.tar.gz
星哥玩云
2022/07/03
4480
推荐阅读
相关推荐
Hive快速入门系列(7) | Hive常见的属性配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档