JAVA通过可达性分析算法来确定堆中哪些对象是应该被回收的。

非常多人包含我曾经在不了解的时候总以为是通过引用计数器来推断某个对象是否应该被回收可是后来想了想包含查阅一些资料发现不是这种。由于假设採用引用计数器的方式没有办法解决循环引用的问题。

关于可达性分析算法,在jvm中有个GC Root Set ,里面有不确定个数的gc root 。能够作为gc root的对象有下面几种

1.虚拟机栈中的引用对象

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

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

4.本地方法栈中jni引用的对象


jvm就是通过这些gc root来判定对象是否还存活的。该算法的基本思想是通过一系列的gc root 做为起始点向下搜索,搜索走过的路径称为引用链,当一个对象到gc root没有不论什么引用链的时候,就说明该对象是不可引用的,此时不可被引用的对象便是能够回收的对象。

resizeSmall&width=786" alt="" name="2824783d-01eb-41d3-8f1e-5ca1123e0dd8" class="en-media" style="margin:0.857412em 0px 1.286em; padding:0px; border:0px; max-width:100%; height:auto">

图中object5 6 7都是能够回收的


尽管是能够回收的。这里还涉及到了是否一定会被回收。

  1. 当对象无法与gc root相连时。判定对象是能够回收的
  2. 当对象被判定为能够回收的时候。推断其时候一定要被回收
  3. 在1,2两个条件满足的情况下。当对象没有覆盖finalize方法。或者finaze方法被运行过虚拟机将判定该对象没有必要运行finalize方法
  4. 假设被判定为没有必要运行finalize方法,那么将会把对象放到一个F-Queue(finalize queue :释放队列)中。最后将由虚拟机建立一个低优先级的finalizer线程去释放F-Queue中的对象
  5. 在释放过程中对象还能够完毕一次自救,自救的方法就是让自己与gc root关联起来就能够了比如在对象的finalize方法中把自己也就是this赋值给一个一个其它对象的变量类型是当前对象的类型属性(可是假设这个其它对象也是在F-Queue中的就不能完毕自救,原因就是这个其它对象本省并不能与gc root相关联),可是由于不论什么一个对象的finalizer方法仅仅能由虚拟机运行一次,所以不论什么一个须要被回收的对象。也仅仅能完毕一次自救。
后记:

finalize这种方法建议大家平时不要用,这种方法全然是当时java诞生的时候为了照应c++程序猿做出的一种妥协,正常开发过程中全然能够忘记有这种方法。

作者:北京小明

QQ:645707787

Phone:18311276689

假设有哪里不对的地方,欢迎指正。

读书笔记-2java虚拟机的可达性算法与finalize方法的更多相关文章

  1. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  2. 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程

    本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...

  3. JVM笔记2-Java虚拟机内存管理简介

    java虚拟机内存管理图如下图所示: 1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成: 1.方法区: 1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法, ...

  4. 《深入理解 Java 虚拟机》读书笔记:虚拟机性能监控与故障处理工具

    正文 一.JDK 的命令行工具 JDK 的 bin 目录下提供了一些用于监视虚拟机和故障处理的命令行工具. 名称 主要作用 jps JVM Process Status Tool,显示正在运行的虚拟机 ...

  5. 【转载】 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    原文地址: https://www.cnblogs.com/steven-yang/p/5686473.html ------------------------------------------- ...

  6. 图论——读书笔记(基于BFS广度优先算法的广度优先树)

    广度优先树 对于一个图G=(V,E)在跑过BFS算法的过程中会创建一棵广度优先树. 形式化一点的表示该广度 优先树的形成过程是这样的: 对于图G=(V,E)是有向图或是无向图, 和图中的源结点s, 我 ...

  7. effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator

    加锁和解锁,也可以在构造函数和析构函数里面,自动调用. 相等和等价的关系:等价是用在排序的时候,跟less函数有关. vector,deque,string 要用erase-remove组合:而关联容 ...

  8. 《深入理解 Java 虚拟机》读书笔记:虚拟机类加载机制

    正文 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 一.类加载的时机 1.类的生命 ...

  9. 《深入理解 Java 虚拟机》读书笔记:虚拟机字节码执行引擎

    正文 执行引擎是 Java 虚拟机最核心的组成部分之一.在不同的虚拟机实现里,执行引擎在执行 Java 代码时可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也 ...

随机推荐

  1. 多线程下,多次操作数据库报错,There is already an open DataReader associated with this Command which must be closed first.

    原文:https://www.cnblogs.com/sdusrz/p/4433108.html 执行SqlDataReader.Read之后,如果还想用另一个SqlCommand执行Insert或者 ...

  2. 网页QQ唤起

    网页QQ唤起 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  3. DataTable排序

    DataRow[] rows = dt.Select("", "name asc");   DataTable t = dt.Clone();   t.Clea ...

  4. eclipse逆向生成实体类

    (转自:http://blog.csdn.net/wangpeng047/article/details/6877720) 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理 ...

  5. Spring Cloud 从入门到精通

    Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说,它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量. 本 ...

  6. BZOJ 2973 入门OJ4798 石头游戏

    矩阵递推 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring ...

  7. Spring学习之路——简单入门HelloWorld

    Spring简单介绍 Spring是一个提供了解决J2EE问题的一站式框架. Spring的核心是反转控制,通过配置文件完成业务对象之间的依赖注入,他鼓励一个良好的习惯,就是注入对接口编程而不是对类编 ...

  8. springboot开发 第一个案例之hello,world!

    开发环境:(1)Eclipse Java EE  Version: Neon Release (4.6.0)  Build id: 20160613-1800    (2)apache-maven-3 ...

  9. leetcode 15. 3Sum 二维vector

    传送门 15. 3Sum My Submissions Question Total Accepted: 108534 Total Submissions: 584814 Difficulty: Me ...

  10. msp430项目编程35

    msp430中项目---nand接口编程35 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结