java值傳遞和堆heap內(nèi)存垃圾回收
/**
* java值傳遞和堆heap內(nèi)存垃圾回收
*/
public class Student {
? ?String name;
? ?int age;
? ?Student friend;
? ?//引用類型
? ?public static void main(String[] args) {
? ? ? ?Student s1 = new Student();
? ? ? ?//新對象地址賦值給s1
? ? ? ?s1.age = 10;
? ? ? ?Student s2 = s1;
? ? ? ?//將s1的值賦值給s2 s2和s1地址相同,也指向同一個對象
? ? ? ?s2.age = 20;
? ? ? ?System.out.println(s1.age);
? ? ? ?//s2地址指向的對象更改了age=20 s1指向的同一個對象 對象的屬性改變了,s1只是對象的地址,所以s1.age隨對象改變
? ? ? ?int age = 1;
? ? ? ?//類的成員變量age和方法的局部變量age不沖突
? ? ? ?int age1 = age;
? ? ? ?age1 = 3;
? ? ? ?System.out.println(age);
? ? ? ?//s1s2是引用地址 age1是數(shù)值和age=1不影響
? ? ? ?Student s3 = new Student();
? ? ? ?s1.friend = s3;
? ? ? ?s3.friend = s1;
? ? ? ?//s1和s3相互引用
? ? ? ?s1 = null;
? ? ? ?s2 = null;
? ? ? ?s3 = null;
? ? ? ?//將s1s2s3賦值null空 堆heap中對象不被引用 視為 垃圾
? ? ? ?//兩個對象互相引用,沒有來自程序的引用,不再起作用同樣視為 垃圾
? ? ? ?/*堆內(nèi)分為年輕代、年老代(方法區(qū)也屬于堆)
? ? ? ?新建對象存儲于年輕代內(nèi)的Eden區(qū),當(dāng)Eden區(qū)滿了會觸發(fā)Minor GC 清理掉年輕代各區(qū)的 垃圾
? ? ? ?清理后存活的對象被轉(zhuǎn)移至survivor區(qū)1區(qū),survivor分1區(qū)和2區(qū),每次Minor GC會把區(qū)內(nèi)存活的對象轉(zhuǎn)移到另外一個區(qū)
? ? ? ?對象被轉(zhuǎn)移15次以上依然存活,被轉(zhuǎn)移至年老代Tenured區(qū)
? ? ? ?年老代滿了會觸發(fā)Major GC 清理年老代內(nèi)的垃圾
? ? ? ?Full GC 會清理年輕代、年老代、方法區(qū)的垃圾,成本較高
? ? ? ? */
? ?}
}