Java對象在JVM中的生命周期


      當你通過new語句創建一個java對象時,JVM就會為這個對象分配一塊內存空間,只要這個對象被引用變量引用了,那么這個對象就會一直駐留在內存中,否則,它就會結束生命周期,JVM會在合適的時候回收它所占用的內存。
 
下面通過偽代碼來解釋java對象在JVM中的生命周期:
 1 class Teacher:  2      //屬性
 3       String   tname;
 4       Set<Student> students;
 5 
 6     //有參構造函數
 7       Teacher(String tname,  Set<Student> 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對象的引用,當向集合添加一個對象時,其實就是把這個對象的引用添加到集合中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM