Java垃圾回收1

news2024/11/26 15:38:10

1.对象什么时候可以被垃圾器回收

1.垃圾回收的概念

        为了让程序员更专注于代码的实现,而不用过多的考虑内存释放的问题,所以, 在Java语言中,有了自动的垃圾回收机制,也就是我们熟悉的GC(Garbage Collection)。

        有了垃圾回收机制后,程序员只需要关心内存的申请即可,内存的释放由系统自 动识别完成。

2.对象什么时候被回收

        简单一句就是:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。

如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法。

3.引用计数法

说明:一开始执行String demo = new String("123"); 时,栈中会创建一个demo变量,由于是new,会在堆中开辟一个空间存储当前对象。此时ref = 1。后面执行 String demo = null; demo变量就不再指向堆中的对象了,ref = 0;此时说明个对象可以被垃圾回收,释放内存。

但是,这种方法也有问题:

说明:一开始 a,b 指向堆中对象时 ref = 2;后面指向空时,由于堆中a,b对象之间出现了循环引用,就导致了:没有变量引用这两个对象,但 ref = 1,无法垃圾回收!这就可能导致内存泄漏。

4.可达性分析算法

现在的虚拟机采用的都是通过可达性分析算法来确定哪些内容是垃圾。

        会存在一个根节点【GC Roots】,引出它下面指向的下一个节点,再以下一个节点节点开始找出它下面的节点,依次往下类推。直到所有的节点全部遍历完毕。

根对象是那些肯定不能当做垃圾回收的对象,就可以当做根对象

局部变量,静态方法,静态变量,类信息

核心是:判断某对象是否与根对象有直接或间接的引用,如果没有被引用, 则可以当做垃圾回收

说明:

        X,Y这两个节点是可回收的,但是并不会马上的被回收!! 对象中存在一个方法【finalize】。当对象被标记为可回收后,当发生GC时,首先会判断这个对象是否执行了finalize方法,如果这个方法还没有被执行的话,那么就会先来执行这个方法,接着在这个方法执行中,可以设置当前这个对象与GC ROOTS产生关联,那么这个方法执行完成之后,GC会再次判断对象是否可达,如果仍然不可达,则会进行回收,如果可达了,则不会进行回收。

        finalize方法对于每一个对象来说,只会执行一次。如果第一次执行这个方法的时候,设置了当前对象与RC ROOTS关联,那么这一次不会进行回收。 那么等到这个对象第二次被标记为可回收时,那么该对象的finalize方法就不会再次执行了。

四种GC Root:

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

/**
* demo是栈帧中的本地变量,当 demo = null 时,由于此时 demo 充当了 GC
Root 的作用,demo与原来指向的实例 new Demo() 断开了连接,对象被回收。
*/
public class Demo {
    public static void main(String[] args) {
        Demo demo = new Demo();
        demo = null;
    }
}

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

    /**
     * 当栈帧中的本地变量 b = null 时,由于 b 原来指向的对象与 GC Root (变量
     * b) 断开了连接,所以 b 原来指向的对象会被回收,而由于我们给 a 赋值了变量的
     * 引用,a在此时是类静态属性引用,充当了 GC Root 的作用,它指向的对象依然存
     * 活!
     */
    public class Demo {
        public static Demo a;

        public static void main(String[] args) {
            Demo b = new Demo();
            b.a = new Demo();
            b = null;
        }
    }

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

     /**
     * 常量 a 指向的对象并不会因为 demo 指向的对象被回收而回收
     */
    public class Demo {
        public static final Demo a = new Demo();
        public static void main(String[] args) {
            Demo demo = new Demo();
            demo = null;
        }
    }

4.本地方法栈中 JNI(即一般说的 Native 方法)引用的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程ServerSocketChannel

ServerSocketChannel 1 非阻塞 vs 阻塞1.1 阻塞1.2 非阻塞1.3 多路复用 2 Selector2.1 创建2.2 绑定 Channel 事件2.3 监听 Channel 事件2.4 💡 select 何时不阻塞 3 处理 accept 事件💡 事件发生后能否不处理 4 处理 read 事件4.1 💡 为何要…

vscode绿绿主题setting config

下载插件Green Tree Theme 选greentree ctrl shift p找到setting {"workbench.colorTheme": "Green Tree","editor.fontSize": 16.5, // 字号"workbench.colorCustomizations": {"[Green Tree]": {"activityBarBadge.…

【Lattice FPGA 开发】Modelsim与Diamond联合仿真

本文讲解Modelsim与Diamond进行联合仿真步骤,以及对遇到问题的解决与说明。 文章目录 软件版本0. Diamond设置文件为仿真文件特别注意 1. Diamond设置仿真软件为Modelsim2. Modelsim编译Lattice的库文件2.1 新建文件夹存放库文件2.2 Modelsim中建立新的仿真库2.2.1…

探秘Redis:从数据类型到API

欢迎大家关注我的微信公众号“软件求生”,我们将会定期为大家带来更多有趣的技术分享和实用的开发技巧。感谢大家的支持! 大家好,我是小米,今天我们来聊一聊阿里巴巴面试中经常会遇到的一个热门话题——Redis数据类型和相关API。Redis作为一款高性能的键值对存储数据库,其…

LevelDB源码阅读笔记(1、整体架构)

LevelDB源码阅读笔记(1、整体架构) LeveDB源码笔记系列: LevelDB源码阅读笔记(0、下载编译leveldb) LevelDB源码阅读笔记(1、整体架构) 前言 对LevelDB源码的博客,我准备采用总…

HZNUCTF第五届校赛实践赛初赛 Web方向 WriteUp

ezssti 很简单的ssti 源码给了,调用Eval即可执行命令 package mainimport ("fmt""net/http""os/exec""strings""text/template" )type User struct {Id intName stringPasswd string }func (u User) Ev…

短视频去水印解析接口 可测试

短视频解析聚合接口80多个热们短视频平台。可测试 接口开发文档: 返回格式: JSON 请求方式: GET/POST 示例请求地址:https://www.dspqsy.vip/spapi?keykey&url短视频url 请求参数说明: 字段必填类型说明url是…

Golang | Leetcode Golang题解之第36题有效的数独

题目: 题解: func isValidSudoku(board [][]byte) bool {var rows, columns [9][9]intvar subboxes [3][3][9]intfor i, row : range board {for j, c : range row {if c . {continue}index : c - 1rows[i][index]columns[j][index]subboxes[i/3][j/3]…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(二)

09 电路设计 前面介绍了系统的硬件框图如下: 硬件基本分为三块,两个摄像节点,一个终端节点。 1. 摄像节点硬件 摄像节点由一个DE10-Nano开发板和一个D8M摄像头实现,DE10-Nano开发板的HDMI接口外接HDMI显示器来显示拍摄到的视频。…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架,并在此基础上添加了字符设备驱动框架,实现了读 / 写SPI设备中数据的函数,文章如下: Linux下SPI设备驱动实验:向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

基于springboot实现工程教育认证的计算机课程管理平台项目【项目源码+论文说明】

基于springboot实现计算机课程管理平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足…

opencv | 编译缺失ippicv相关文件解决方案

1.执行cmake后,查看控制台输出信息 ~/VM_data/opencv-4.9.0$ cd buile_temp ~/VM_data/opencv-4.9.0/buile_temp$ cmake ..2.去浏览器打开链接,下载对应的压缩包,解压到 路径:/3rdparty/ippicv/

【Canvas技法】四条C形色带填满一个圆/环形

【关键点】 通过三角函数计算控制点的位置。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>四条C形色带填满一个…

2024华中杯C题平面曲线重建思路

华中杯数学建模思路 光纤传感技术是伴随着光纤及光通信技术发展起来的一种新型传感器技 术。它是以光波为传感信号、光纤为传输载体来感知外界环境中的信号&#xff0c;其基本原理是当外界环境参数发生变化时&#xff0c;会引起光纤传感器中光波参量&#xff08;如波长、相位、…

IDEA使用SCALA

一、在IDEA中下载插件 在设置->插件中找到scala&#xff0c;并下载。 下载完成后重启idea 二、在idea中创建spark的RDD操作项目 新建项目选中Scala。 创建完成后为项目添加java包&#xff0c;这个添加的是spark安装包中jars目录下的所有jar包 然后编写RDD操作 import or…

24年蓝桥杯java-b组

24年蓝桥杯javaB组 蓝桥杯在昨天考完了&#xff0c;结果很不乐观&#xff0c;哎&#xff0c;还是太笨了&#xff0c;脑子确实转的慢&#xff1b;&#x1f625; 本篇博客中解题思路和代码并不一定完全正确&#xff0c;是我和同学们讨论的解答方法&#xff0c;但并未使用官方题…

Sharding-JDBC笔记1

Sharding-JDBC笔记1 1.分库分表1.1 垂直分库1.2 垂直分表1.3 水平分库1.4 水平分表 2.存在问题2.1 事务一致性2.2 跨节点关联查询2.3 跨节点分页、排序函数2.4 主键避重2.5 公共表 1.分库分表 分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题&#xff0c;将原来…

亚马逊云挂机项目,单机600+,详细拆解

一、什么是亚马逊云挂机项目&#xff1f; 此项目有很多种叫法&#xff0c;也有人叫它亚马逊店铺挂机浏览项目。 二、赚钱原理&#xff1f; 新入驻的亚马逊商家往往是没有流量和曝光的&#xff0c;为了让店铺的商品更多的被人看到&#xff0c;花钱在平台直接买流量又不划算&a…

android远程更新下载apk

最近业务有涉及到&#xff0c;奈何是个app代码小白&#xff0c;遂记录一下 一&#xff1a;AndroidManifest.xml文件配置 application标签里面加上 android:networkSecurityConfig"xml/network_config" <!-- app下载更新配置--> <uses-permission andr…

国内主流的盗版软件检测工具有哪些?盗版软件检测工具推荐

在当前数字化时代&#xff0c;企业面临着越来越多的挑战&#xff0c;其中之一就是如何防止员工私自安装使用盗版软件。盗版软件不仅侵犯了知识产权&#xff0c;还可能给企业带来诸多风险如安全隐患、法律纠纷和财务损失。因此&#xff0c;企业需要采取一系列措施来防范员工私自…