问题:请讲下在java中如何判断一个对象是否为垃圾

分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾;

回答要点:

主要从以下几点去考虑,

1、GC回收的是什么,回收发生在内存的那部分?

2、怎么判断一个对象是否可以被回收?

3、垃圾回收的算法有哪些?

都说C/C++语言难学,难的点其实不是语言本身,而是在内存管理方面,因为在C/C++中需要开发者自己管理内存,包括申请内存和释放内存,不恰当的释放内存经常导致程序崩溃,而在java中开发者却不需要关心何时释放内存。很多人认为java没有内存管理的概念,其实不是这样的,只不过java虚拟机帮我们做了,那就是垃圾回收,简称GC。

所谓GC就是要回收java程序允许过程中产生的垃圾,也可以理解为不再使用的内存,一个程序的内存是有限的,随着程序的运行,肯定存在申请内存的情况,如果使用完内存迟迟得不到释放,那么程序最终会因为没有内存而停止,所以内存的释放很重要。在面向对象程序中内存的释放意味着对象的销毁,只有对象销毁了内存才有可能得以释放,内存才至于枯竭。

上面明白了为什么要有GC,GC的目的就是为了释放内存,使程序可以持续运行。在java中程序运行时的内存区域可分为堆、虚拟机栈、本地方法栈、程序计数器、方法区。GC回收的区域是堆和方法区,为什么回收这两个区域那,因为他们是线程共享的,即java程序中所有的线程都可以访问,在这两部分中回收的重点在堆,方法区一般回收起来很困难,下面的介绍均是指堆方法区的垃圾回收。为什么虚拟机栈、本地方法栈、程序计数器没有GC,因为他们是线程私有的,随着线程的消亡而消亡。

从网上找了一张运行时内存区域的图,

该图很形象的说明了java运行时数据区的每个部分,当然是逻辑划分而不是物理划分。

现在,弄清楚了GC要回收的内存区域是堆,堆中存放的是对象,在java的世界中万事万物都是对象,归根结底要回收的是堆中的对象。那如何确定什么对象是可回收的什么对象是不可回收的。java提供了两种算法,引用计数法和可达性分析法。java中使用的是可达性分析法

引用计数法

所谓引用计数法,每个对象额外保存一个计数属性,如果有一个对象引用了它,那么该属性会加1,例,

A a=new A();
A a2=a;

上面这段代码会在堆中生成一个A的对象实例,且a、a2都指向了该对象,那么该对象的计数属性便是2,又如,

A a=new A();
A a2=a;
a=null;
a2=null;

这时a、a2均指向了null,那么A的对象实例的计数属性则为0,按照引用计数法的定义这时该实例可以被回收。

看上去该算法很完美,但是java中为什么没用,有个问题如果出现循环引用怎么办,

A a=new A();
B b=new B(); a.b=b;
b.a=a; a=null;
b=null;

上面的代码在堆中会有一个A的实例一个B的实例,且计数属性均为1,执行了第3、4两行代码后,两个实例的引用计数均为2,执行了5、6两行代码后两个实例的计数属性均为1,这时a、b均指向了null,但是堆中的两个实例的计数属性的值却不为0,那么这两个实例无法回收,存在内存泄漏的风险;

可达性分析法

所谓可达性分析法,就是从一些称为引用链(GC ROOTS)的对象作为起点,从这些节点向下搜索,搜索走过的路径称为引用链(reference chain),当一个对象到GC ROOTS没有引用链的时则该对象不可达,该对象可以被回收。哪些对象是引用链那,虚拟机栈是java程序中方法执行的区域,每个方法的执行对应着一个栈帧的入栈和出栈,方法执行完了其申请的内存便可以释放,所以栈帧中的对象可作为引用链对象,同时本地方法栈的情况也是类似的;在方法区中存在常量和类静态变量,这两种变量也可以作为引用链对象,总结下来有下面几种,

1、虚拟机栈中的局部变量表中的对象;

2、方法区中常量引用的对象;

3、方法区中类的静态变量引用的对象;

4、本地方法栈中JNI引用的对象;

使用可达性分析方法判断为可回收的对象,还有一次逃过回收的机会,那就是在Object类中有finalize()方法,如果在该方法中没有与上述的引用链建立链接,那么该对象则确定要被回收。

知道了要回收的内存区域,以及如何判定哪些对象可以被回收,确定了回收对象,接下来就是如何回收,且听下次分解。

参考:https://www.cnblogs.com/czwbig/p/11127124.html

java面试一日一题:如何判断一个对象是否为垃圾对象的更多相关文章

  1. java面试一日一题:如何设计一款垃圾回收器

    问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...

  2. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  3. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  4. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  5. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  6. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  7. java面试一日一题:java中一个对象实例的结构是什么样子的

    问题:请讲下在java程序运行时一个对象实例的数据结构是什么样子的 分析:该问题主要考察对java中对象的理解,在程序运行过程中一个对象实例是以什么样的形式存在的 回答要点: 主要从以下几点去考虑, ...

  8. java面试一日一题:java线程池

    问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...

  9. java面试一日一题:讲对mysql的MVCC的理解

    问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...

随机推荐

  1. python的迭代

    迭代 1:并行迭代 程序可以同时迭代两个序列 names["zhangsan","lisi","zhaosi"] age[12,13,14] ...

  2. python-3-2

    一 切片 1.切片是list取值的一种方式 列子: nums = ['a','b','c','d','e','f','h','g','k','l','kk','nn','ee'] 取b和c元素出来 p ...

  3. std::thread线程库详解(5)

    目录 目录 前言 信号量 counting_semaphore latch与barrier latch barrier 总结 前言 前面四部分内容已经把目前常用的C++标准库中线程库的一些同步库介绍完 ...

  4. 用python连接数据库模拟用户登录

    使用pycharm下载pymysql库,在终端输入命令: pip install mysql 使用pycharm写登入操作前需要在数据库内添加一些数据,比如用户名和密码 create database ...

  5. ASP.NET网页开发基础(7)

    整理了一点的小知识点: 1.ASP.NET网页扩展名:    .asax 全局应用程序类的扩展名     .xml 访问网页时的扩展名     .htm     .ascx Web用户控件的扩展名   ...

  6. java面试-JDK自带的JVM 监控和性能分析工具用过哪些?

    一.JDK的命令行工具 1.jps(JVM Process Status Tools):虚拟机进程状况工具 jps -l 2.jinfo(Configuration Info for java):Ja ...

  7. Re:从零开始的Git保姆级使用教程

    观前提示: 本文主要介绍了用命令的方式对Git进行操作(全程用的win10系统),而对于TortoiseGit和github desktop等图形化操作知识,只进行简单介绍或提及,详细使用会在提到的地 ...

  8. Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件

    带下拉选项的输入框 (Textbox with Dropdown) 是既允许用户从下拉列表中选择输入又允许用户自由键入输入值.这算是比较常见的一种 UI 元素,可以为用户提供候选项节省操作时间,也可以 ...

  9. 基于gitlab的项目管理流程

    框架 背景 个人是不太愿意使用用户体验差的软件来做项目管理,行业内,要找到这么一款软件,又要符合自己的需求,着实不容易.要免费,易用性要好,要安全,要有数据统计.而程序员的世界,SVN 之后,可能没有 ...

  10. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...