/**
* java 值传递和堆heap内存垃圾回收
*/
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是数值和age=1不影响
Student s3 = new Student();
s1.friend = s3;
s3.friend = s1;
//s1和s3相互引用
s1 = null;
s2 = null;
s3 = null;
//将s1s2s3赋值null空 堆heap中对象不被引用 视为 垃圾
//两个对象互相引用,没有来自程序的引用,不再起作用同样视为 垃圾
/*堆内分为年轻代、年老代(方法区也属于堆)
新建 对象存储 于年轻代内的Eden区,当Eden区满了会触发Minor GC 清理掉年轻代各区的 垃圾
清理后存活的对象被转移至survivor区1区,survivor分1区和2区,每次Minor GC会把区内存活的对象转移到另外一个区
对象被转移15次以上依然存活,被转移至年老代Tenured区
年老代满了会触发Major GC 清理年老代内的垃圾
Full GC 会清理年轻代、年老代、方法区的垃圾,成本较高
*/
}
}