gc相关的算法
1.引用计数算法:在堆中每个对象都有一个引用计数,被引用一次,计数加1,被引用变量值变为null,则计数减1,直到计数为0,则表示变成无用对象,优点是算法简单,缺点是“循环引用的无用对象”无法识别
public class Student {
String name;
Student friend;
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
s1.friend = s2;
s2.friend = s1;
s1 = null;
s2 = null;
}
}
s1和s2互相引用,导致引用计数永远不为0 ,但是实际已无用,却没有办法识别。
2.引用可达法(根搜索算法)
程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点被认为是没有被引用的节点,也就是没有用的节点
垃圾的回收过程:
1.新创建的对象,绝大多数都会存储在Eden中
2.当Eden满了(到达一定的比例以后)不能创建对象,则触发垃圾回收(GC),将无用的额对象清理掉,将剩余对象复制到某个Survivor中,如s1,同时清空Eden区
3.当Eden区再次满了,会将s1中的不能清空的对象存到另外一个Survivor中,如s2,同时将Eden中不能清空的对象,也复制到s1中,保证Eden和s1,均被清空
4.重复多次(默认是15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中
5.当Old区满了,则会触发一个一次完整的垃圾回收(FullGC),之前新生代的垃圾回收称为(MinorGC)
对象的创建过程分为以下四步:
1.分配对象空间,并将对象成员变量初始化为0或者空
2.执行属性值的显式初始化
3.执行构造方法
4.返回对象的地址给相关的变量
this的本质就是“创建好的对象的地址”!由于在构造方法调用前,对象已经创建好,因此在构造方法中也可以使用this代表“当前对象”
重点:
1.在对象中可以使用this关键字,因为它从属于对象,而在方法区中则不能使用this关键字,因为它从属于类的相关信息
2.在static修饰的属性或方法中,也不能使用this关键字,也不能使用普通的属性,因为它也在方法区中,方法区中没有对象
在类中,static声明的成员变量为静态成员变量(类变量),它的生命周期和类相同,在整个应用程序执行期间都有效
static修饰的成员变量和方法,从属于类,普通变量和方法从属于对象
public class User {
int id;
String name;
String password;
static String company = "百度";
public User(int id,String name ) {
this.id = id;
this.name = name;
}
public void login() {
printCompany();
System.out.println(company);
System.out.println("登陆"+name);
}
public static void printCompany() {
// login();
System.out.println(company);
}
public static void main(String[] args) {
User u = new User(9527,"余小浩");
User.printCompany();
User.company = "腾讯";
User.printCompany();
}
}
在静态方法中可以使用静态变量,不能使用非静态成员,但是普通的成员和方法是可以去访问静态成员变量和方法的