博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java对象在JVM中的生命周期
阅读量:4619 次
发布时间:2019-06-09

本文共 1496 字,大约阅读时间需要 4 分钟。

      当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JVM会在合适的时候回收它所占用的内存。
 
下面通过伪代码来解释java对象在JVM中的生命周期:
1 class Teacher: 2      //属性 3       String   tname; 4       Set
students; 5 6 //有参构造函数 7 Teacher(String tname, Set
students ); 8 9 //setter,getter省略10 11 class Student:12 //属性13 String sname;14 Teacher teachrer;15 16 //有参构造函数17 Student(String sname,Teacher teacher);18 19 //setter,getter省略20 main:21 Teacher t = new Teacher("Maker",new hashSet());22 23 Student s1 = new Studnet("student1",null);24 Student s2 = new Studnet("student2",null);25 26 s1.getTeacher(t);27 t.getStudnet().add(s1);28 29 30 s1 = null;31 s2 = null;32 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对象的引用,当向集合添加一个对象时,其实就是把这个对象的引用添加到集合中。

转载于:https://www.cnblogs.com/MOBIN/p/4853901.html

你可能感兴趣的文章
python+rabbitMQ实现生产者和消费者模式
查看>>
“模态”对话框和“后退”按钮
查看>>
关于javascript实现的网站页面侧边悬浮框"抖动"问题
查看>>
linux_命令格式和命令提示符
查看>>
Cocos2d-X-3.0之后的版本的环境搭建
查看>>
when case group by 的用法集合
查看>>
Python—列表(一个“打了激素”的数组)
查看>>
认识XmlReader
查看>>
JAVA学习Swing章节标签JLabel中图标的使用
查看>>
sqlserver,oracle,mysql等的driver驱动,url怎么写
查看>>
局部变量和static变量的区别
查看>>
说说excel
查看>>
七周七语言: Clojure Day 1
查看>>
IE下iframe不能正常加载,显示空白
查看>>
mysql服务性能优化—my.cnf配置说明详解
查看>>
【Atcoder】CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
查看>>
洛谷P1908 逆序对
查看>>
noip模拟赛 排列
查看>>
List 中添加多个List集合以及add() 与addAll()的区别
查看>>
如何处理测试人员的流动问题?
查看>>