Java对象在JVM中的生命周期详解
作者:潘佳琦 发布时间:2023-11-24 16:15:03
标签:Java,对象,JVM,生命周期
概念
在Java中,对象的生命周期包括以下几个阶段:
创建阶段(Created)
应用阶段(In Use)
不可见阶段(Invisible)
不可达阶段(Unreachable)
收集阶段(Collected)
终结阶段(Finalized)
对象空间重分配阶段(De-allocated)
Java对象在JVM中的生命周期
当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时候回收它所占用的内存。
伪代码:
class Teacher:
//属性
String name;
Set<Student> students;
//有参构造函数
Teacher(String tname, Set<Student> students );
//setter,getter省略
class Student:
//属性
String name;
Teacher teachrer;
//有参构造函数
Student(String sname,Teacher teacher);
//setter,getter省略
main:
Teacher t = new Teacher("张三",new hashSet());
Student s = new Studnet("李四",null);
s.getTeacher(t);
t.getStudnet().add(s);
s = null;
t = null;
创建了一个Teacher对象和一个个Student对象,并且定义了2个引用变量t,s,分别引用了Teacher对象,Student对象
建立了Teacher对象和Student对象的双向关联关系,表示Student对象的teacher属性引用了Teacher对象,Teacher对象的students集合存放了Student对象的引用。
把s变量置为了null,s变量不再引用Student对象了,但是Teacher对象的students仍然存放着Student对象的引用,那么Student对象就会结束生命周期;把t变量置为null后,Teacher不再被任何引用变量所引用,自然Teacher对象的引用也不存在了,也就结束了周期。
虽然最后Teacher和Student之前还存在着双向引用,但是在程序中并没有任何引用变量来引用这两个对象,程序也就无法访问到这个两个变量,最终还是被JVM的垃圾回收器当作无用的对象所回收。
来源:https://segmentfault.com/a/1190000019217798


猜你喜欢
- android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形。首先我们要做一个处理图片的自定义控件,把传入的图
- 首先声明本文是基于GitHub上"baoyongzhang"的SwipeMenuListView修改而来,该项目地址:h
- 当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到
- 一、材料准备1、jdk1.8的安装包2、maven安装包3、idea工具二、配置jdk1.8环境变量1.jdk下载jdk下载网址(点击此链接
- 1.概述项目中经常会遇到一个应用需要访问多个数据源的情况,本文介绍在SpringBoot项目中利用SpringDataJpa技术如何支持多个
- 使用new操作符来创建对象,其背后到底发生了什么?有一个父类Animal,Dog派生于Animal。class Program
- XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识
- 背景2021年第一天早上,客户突然投诉说系统的一个功能出了问题,紧急排查后发现后端系统确实出了bug,原因为前端传输的JSON报文,后端反序
- 本文实例讲述了Android编程防止进程被第三方软件杀死的方法。分享给大家供大家参考,具体如下:项目测试的时候发现,按home键回到桌面,再
- MyBatis根据条件批量修改字段背景:给学生改作业,只要是对的都批量进行数据库的修改代码以及注释conttoller@RestContro
- 本文实例讲述了JFreeChart插件实现的折线图效果。分享给大家供大家参考,具体如下:package com.lei.jfreechart
- eclipse汉化包我们会经常用到,因为它可以帮助英语基础差的用户更快的掌握这个软件,非常方便,但是我看了下整个互联网上并没有对这个汉化包进
- 1 配置多数据源时,application.yml 的有关mybatis的配置是失效的,因为他不知道配置哪一个数据源2 applicatio
- Java通过证书访问Https请求创建证书管理器类import java.io.FileInputStream;import java.se
- 序言:事件:此web项目的功能及其简单,就是有客户端来访问redis序列号服务时发送jison报文,项目已经在测试环境成功运行2周了,具体的
- 启动类的存放位置今天,写了一个项目,但是启动类为什么一直报错我是放在这个位置的,但是就一直报放在默认包错误 想记录下微服务启动类的
- IDEA 2020.1 版自动导入MAVEN依赖的方法(新版MAVEN无法自动导入/更新POM依赖、MAVEN设置自动更新、自动更新快捷键)
- 思路如下:给定一个含有n个元素的整型数组a,求a中所有元素的和。问题的难点在于如何使用递归上。如果使用递归,则需要考虑如何进行递归执行的开始
- 功能需求:为软件设定一个使用有效期,当超过指定时间后,程序无法运行。实现思路:定义一个常量,用于记录一个时间,我们称之为标记时间,使用当前时
- 一:自定义异常类:package 自定义异常; //或者继承RuntimeException(运行时异常) public class MyE