Java对象在JVM中的生命周期
class Teacher:
//属性
String tname;
Set<Student> students; //有参构造函数
Teacher(String tname, Set<Student> students ); //setter,getter省略 class Student:
//属性
String sname;
Teacher teachrer; //有参构造函数
Student(String sname,Teacher teacher); //setter,getter省略
main:
Teacher t = new Teacher("Maker",new hashSet()); Student s1 = new Studnet("student1",null);
Student s2 = new Studnet("student2",null); s1.getTeacher(t);
t.getStudnet().add(s1); s1 = null;
s2 = null;
t = null;
在上面代码中,s2所引用的对象在31行时就结束了生命周期,而s1和t所引用的对象在32行结束生命周期,下面请看java在生命周期的流程:
一:21~24行创建了一个Teacher对象和两个Student对象,并且定义了3个引用变量t,s1,s2分别引用了Teacher对象,Student1对象和Student2对象,如下图所示:
二:26~27行建立了Teacher对象和Student对象的双向关联关系,表示Student1对象的teacher属性引用了Teacher对象,Teacher对象的students集合存放了Student1对象的引用。
三:在30行中,虽然把s1变量置为了null,s1变量不再引用Studetn1对象了,但中Teacher对象的students仍然存放着Student1对象的引用,那么Student1对象就会结束生命周期;把s2变量置为null,Student2对象不再被任何引用量变引用,也自然的就结束了生命周期,最终被JVM垃圾回收器收回之前所占用的内存;把t置o null后,Teacher不再被任何引用变量所引用,自然Student1对象的引用也产存在了,也就结束了周期。如下图所示:
虽然最后Teacher和Student之前还存在着双向引用,但是在程序中并没有任何引用变量来引用这两个对象,程序也就无法访问到这个两个变量,最终还是被JVM的垃圾回收器当作无用的对象所回收。
注意:Java集合(如Set,List,Map)中存放着的是java对象的引用,当向集合添加一个对象时,其实就是把这个对象的引用添加到集合中。
Java对象在JVM中的生命周期的更多相关文章
- Hibernate 系列 06 - 对象在JVM中的生命周期
引导目录: Hibernate 系列教程 目录 Java对象通过new命令进行创建,Java虚拟机(Java Virtual Machine,JVM)会为新的Java对象在内存中开辟一个新空间以存放次 ...
- 《深入Java虚拟机学习笔记》- 第7章 类型的生命周期/对象在JVM中的生命周期
一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令 ...
- jvm详情——2、Java对象在jvm中的大小
Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷.在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任 ...
- 重磅硬核 | 一文聊透对象在 JVM 中的内存布局,以及内存对齐和压缩指针的原理及应用
欢迎关注公众号:bin的技术小屋 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以 ...
- JVM 类的生命周期、类加载器
类的加载.连接与初始化 • 1. 加载:查找并加载类的二进制数据 • 2. 连接 – 2.1 验证:确保被加载的类的正确性 ...
- Java多线程——线程的优先级和生命周期
Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- 【译】深入理解Rust中的生命周期
原文标题:Understanding Rust Lifetimes 原文链接:https://medium.com/nearprotocol/understanding-rust-lifetimes- ...
- Vue 实例中的生命周期钩子
Vue 框架的入口就是 Vue 实例,其实就是框架中的 view model ,它包含页面中的业务处理逻辑.数据模型等,它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻 ...
- Java 对象在堆中的内存结构
翻译人员: 铁锚 翻译日期: 2013年11月8日 原文链接: What do Java objects look like in memory during run-time? 我们知道,函数每次 ...
随机推荐
- JS 数组扩展函数--求起始项到终止项和
Array.prototype.sum= function(l,r){ l=l==undefined ? 0 : l; r=r==undefined ? this.length - 1 : r; va ...
- Android窗口管理服务WindowManagerService显示Activity组件的启动窗口(Starting Window)的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8577789 在Android系统中,Activ ...
- DotDensityRenderer
关键之处在于获取每个点所代表的的值 这里使用geodatabase类库中idatastatistic接口进行统计字段,再将结果传递给esrisysytem.istatisticsResult进行. 需 ...
- "a newer version of unity web player is required but the auto-update failed"
问题背景描述: 项目采用winform调用unity web player作为播放器在客户端使用. 在有些环境会出现标题所示错误. 经过一翻研究后发现是插件在向服务器请求更新以下文件时报http 30 ...
- 基于avalon1.4.x ----分页组件编写
avalon分页组件 (1.4.x版本) 随着avalon2的推出,avalon1的官网已经不再维护了,现在似乎是找不到avalon 1.4版本的官方文档了,所以本文章所有的内容均不保证正确性,只能保 ...
- Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法
昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景 ...
- java基础学习笔记
Q: What if the main method is declared as private? 如果将主函数声明为私有类型的会怎样? A: The program compile ...
- main()和_tmain()有什么区别
用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是&l ...
- (原)测试intel的并行计算pafor
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/4988264.html 参考网址: 关于mt19937:http://www.cnblogs.com/e ...
- css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡
pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...