java内存管理分为两个方面:内存分配和内存回收,这里的内存分配是指创建java对象时jvm为该对像在堆内存中分配的内存空间。内存回收是指java对象失去引用时,jvm的垃圾回收机制
自动清理该对像,由于jvm内置了自动回收装置,我们错误的认为不存在,内存泄露,资源泄露的问题,其实这种想法是错误的。
不断分配内存会使系统中的可用内存减少,从而降低程序的运行性能。
jvm中的垃圾回收装置是由后台的一条线程控制的,大量分配内存,使得垃圾回收的负担加重,降低程序运行的效率。
static就是一个标志,static的作用就是将实例成员变成类成员,static只能修饰在类里的成员部分,包括成员变量,方法,内部类,不能修饰外部类局部变量,局部内部类
public class BianliangDemo {
// TODO Auto-generated method stub
//int num1=num2+2;(1)
//num2=6;
//static int num1=num2+2;(2)
//static num2=6;
int num1=num+2;//(3)
static int num=6;
}
编译时(1)(2)会提示非法向前引用的错误,(3)编译正常那是因为static修饰的变量属于类,在类加载时就会随之初始化,而num1只有在创建对象时才会初始化。
同一个jvm中每个类只对应一个clss对象,因此一个类对象只需一块内存空间,但是对于实例对象而言该类每创建一次实例就要为实例变量分配一个内存空间。
class Person{
String name;
int age;
static int e;
public void info(){
System.out.println("你的名字"+name+"你的年龄"+age);
}
}
public class BianliangDemo {
public static void main(String[] args) {
Person.e=60;
System.out.println(Person.e);
Person p=new Person();
p.name="lishuai";
p.age=18;
p.info();
System.out.println(p.e);
Person p2=new Person();
p.name="liqian";
p.age=19;
p.info();
p.e=500;
System.out.println(Person.e);
System.out.println(p.e);
System.out.println(p2.e);
}
}
当Person类中的e变量被改以后无论通过Person,p,p2访问e打印的值都是500,那是因为无论使用哪一个对象进行访问,java底层都是通过Person对象来访问的。