`

判断Java对象生死的方式

阅读更多

my git : https://github.com/hejiawang

 

Java虚拟机学习记录整理。

 

一、在Java垃圾回收器清理垃圾对象之前,首先要做的事就是判断哪些对象没人用了、死了、可以回收了;哪些对象还有人用,还活着,不能进行回收。那么垃圾回收器是怎么判断Java对象是生是死呢?

 

二、引用计数算法

       引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它,计数器值就加一,当引用失效,也就是用完了的时候,计数器值就减一,任何时刻计数器值为0的对象,就是没人用的对象,说明该对象可以去死了,那么垃圾回收器将该垃圾对象回收。

       引用计数算法的实现简单,判断效率很高,但是在Java虚拟机中,使用引用计数算法不能达到理想效果,因为引用计数算法很难解决对象之间相互循环引用的问题。比如如下代码:

A a = new A();
B b = new B();
a.aB = b;//A类中有B属性
b.bA = a;//B类中有A属性

        除了上面的引用之外,对象a和b再无任何引用。

        实际上,这两个对象已经没用了,应该进行垃圾收集了,但是他们因为互相引用着对方,导致引用计数的值始终不能为0,于是引用计数算法无法通知垃圾收集器回收它们。

        可见这种引用计数算法在Java虚拟机中管理内存是不可用的。但是用处还是很大的,在其他虚拟机中有用引用计数算法管理内存的。

 

三、可达性分析算法

        可达性分析算法的基本思路:通过一系列的称为“GC Roots”的对象作为起点,从这些起点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则正面此对象是不可用的。

       就像下图中,对象Object5,Object6,Object7,虽然相互之间相互关联,但是它们到GC Roots已经是不可达了,其实已经没人用了,可以回收了。



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

        1、虚拟机栈(栈帧中的本地变量的表)中引用的对象;

        2、方法区中类静态属性引用的对象;

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

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

 

  • 大小: 27.4 KB
7
6
分享到:
评论

相关推荐

    java编写的坦克大战

    通过一个无限循环,程序不断地检测游戏状态,更新坦克和炮弹的位置,判断碰撞,处理生死,以及计算得分。这需要对条件语句、循环语句有深入的理解。 5. **多线程**:为了使游戏画面流畅,坦克大战可能使用了多线程...

    java做的网络版围棋游戏

    4. **数据结构与算法**:围棋游戏需要存储棋盘状态和处理棋局逻辑,这可能涉及到高效的数据结构(如二维数组或矩阵表示棋盘)和算法(如判断生死、计算劫等复杂围棋规则)。 5. **事件监听**:`Listen.class`可能...

    java中的围棋对弈代码

    - **胜负判断**:围棋的胜负判断较为复杂,可能需要用到“眼”(Liberty)计算、死活棋判断(石子的生死状态)等算法。其中,最基础的是判断是否形成五子连珠。 - **AI对弈**:如果程序包含人工智能(AI)对弈功能...

    Java GC笔记总纲1

    - **可达性分析**:判断对象是否可到达,决定其生死。 - **垃圾收集器**:负责扫描和回收内存。 #### 3.3 垃圾回收的分类 - **串行GC**:单线程进行垃圾收集,适用于小规模数据和低性能需求。 - **并行GC**:多线程...

    java坦克大战

    1. 学习Java基础知识:理解面向对象编程、图形用户界面设计、多线程编程等。 2. 参考开源项目:查找并研究Java坦克大战的开源实现,从中学习和借鉴。 3. 实践开发:动手编写自己的Java坦克大战,不断调试和优化,...

    坦克大战游戏Java源代码

    5. **游戏逻辑**:包括坦克的移动规则(如不能穿过障碍物)、子弹轨迹计算、击中判断以及坦克的生死状态管理。 6. **动画效果**:实现爆炸效果通常需要使用帧动画,通过连续显示一系列的图像来模拟动态过程。开发者...

    Java打字游戏源代码

    - `public void panduan()`:判断方法,检查目标字母是否到达底部,更新目标位置,减少生命值,当生命值为0时退出程序。 - `public void fk()`:控制玩家发射物的方法,调整位置使其更接近目标,处理碰撞检测。 ###...

    weiqi.rar_JAVA小游戏_围棋游戏

    3. **游戏逻辑**:严谨的围棋规则实现,包括禁手规则、生死判断、胜负判定等。 4. **AI对战**:内置的计算机对手,可能采用了简单的启发式算法,如最小最大搜索配合Alpha-Beta剪枝,或是更复杂的深度学习模型。 5. *...

    java实现一个简单的植物大战僵尸游戏.zip

    1. **Java基础**:首先,了解Java基础是必不可少的,包括类、对象、继承、封装、多态等面向对象的概念。此外,还需要熟悉Java的异常处理、输入输出流、集合框架(如ArrayList和HashMap)等。 2. **图形用户界面...

    坦克大战(java版代码)

    5. **游戏逻辑**:在游戏的主循环中,开发者会更新游戏状态,处理碰撞检测,判断坦克和子弹的位置是否发生碰撞,以此来决定得分、坦克的生死等。同时,敌方坦克的AI(人工智能)也是通过代码实现的,可能包含随机...

    Java语言写的围棋小游戏。半成品A Go game written in golang(Semi-finished).zip

    2. 围棋算法:实现围棋的规则,包括落子、判断生死、计算眼位、识别禁手等。 3. 图形用户界面(GUI)编程:使用JavaFX或Swing创建游戏界面,处理用户输入事件。 4. 游戏逻辑:设计游戏状态机,管理游戏进程,如回合...

    小游戏大鱼吃小鱼的所有代码

    这包括判断鱼的碰撞、大小比较以及生死状态。开发者通常会创建一个游戏循环,每帧更新所有鱼的状态,检查是否有鱼被吃掉,然后更新屏幕显示。 4. **动画与定时器**:为了实现流畅的动画效果,开发者会使用`javax....

    GC算法和收集器.pdf

    在JVM中,主要有两种算法用来判断对象的生死:引用计数法和可达性分析算法。引用计数法通过计数器来实现,每当对象被引用,计数器加1;引用失效则计数器减1。当计数器为0时,对象被认为不再被使用。但是,这种方法...

    FlappyBird

    碰撞检测则用于判断鸟是否撞到管道或地面,决定游戏的生死状态。物理模拟则体现在鸟的飞行运动上,通过简单的物理规则,如重力,来让鸟的飞行显得更真实。 GUI设计在《Flappy Bird》中同样重要。Java提供了Swing和...

    JVM初探- 内存分配、GC原理与垃圾收集器

    JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、...通过对内存分配策略、对象生死判定、垃圾收集算法和垃圾收集器的理解与应用,可以更好地掌握JVM的内存管理,从而提升应用性能和稳定性。

    浅析Java内存模型与垃圾回收

    2. 筛选:判断对象是否需要执行`finalize()`方法。如果对象没有覆盖`finalize()`,或者已经执行过`finalize()`,则对象将被回收。如果覆盖了`finalize()`,且尚未执行,对象会进入一个特殊队列,等待下次垃圾回收前...

    围棋对弈源代码

    Java是一种面向对象的编程语言,它以类作为程序的基本单元。在围棋对弈项目中,我们可以定义多个类,如`Chessboard`(棋盘)、`Player`(玩家)、`Stone`(棋子)等。`Chessboard`类会包含棋盘的二维数组表示,用于...

    life:这不是游戏,这是生活

    然后,编写一个方法来更新细胞的状态,根据邻居的状态判断其下一时刻的生死。这个过程通常包括计算每个细胞的邻居数量,以及根据规则决定细胞的生死。 在实际编码中,我们可能会遇到性能优化的问题。由于生命游戏...

    大鱼吃小鱼系统分析设计报告

    例如,`CShrimp`类和`CFish`类均包含了用于记录位置、方向、游动距离等状态的成员变量,以及实现移动、绘制、判断生死等功能的成员函数。 特别地,`CFish`类还包含了`m_HP`(生命值)、`m_Eat`(已捕食的数量)和`m...

    2021-2022计算机二级等级考试试题及答案No.19985.docx

    【知识点详解】 1. 运算器:运算器是计算机硬件系统的重要组成部分,它...29. 字符串变量:在Java中,即使字符串内容相同,两个新的String对象也是不同的对象,s1和s2是引用不同的对象,而s3是通过new创建的新对象。

Global site tag (gtag.js) - Google Analytics