java的虚拟机可分为3个部分栈steak,堆stack,方法区method area
栈:
1.栈描述的是一个内存模型,每个方法调用都会在栈中创建一个栈桢,存储局部变量,操作数,方法出口等。
2.栈 先进后出,自下而上存储
3.方法执行完毕,自动释放空间(关闭栈桢)
堆:
1.用于存储创建好的对象和数组(也是对象)
2.只有一个堆,为所有线程共享,用垃圾回收器回收
方法区:
1.存放类的信息(代码),static变量,字符串常量等,也是堆,可以理解为在堆内。
分析以下代码的运行顺序和再内存中的存储过程
代码后附有 详解内存空间分析图
public class SxtStu {
//属性fields
int id;
String sname;
int age;
Computer comp; //计算机
//方法
void study(){
System.out.println("我在认真学习!!,使用电脑:"+comp.brand);
}
void play(){
System.out.println("我在玩游戏!王者农药!");
}
//构造方法。用于创建这个类的对象。无参的构造方法可以由系统自动创建。
SxtStu(){
System.out.println("调用了无参的构造方法!");
}
//程序执行的入口,必须要有
//javac Sxtstu.java , java Sxtstu
public static void main(String[] args) {
SxtStu stu = new SxtStu(); //创建一个对象
stu.id=1001;
stu.sname= "高淇";
stu.age = 18;
Computer c1 = new Computer();
c1.brand = "联想";
stu.comp = c1;
stu.play();
stu.study();
}
}
class Computer {
String brand;
}
分析:
第一步:javac编译
第二步:java.SxtStu,启动虚拟机,加载内存空间,将SxtStu类信息放入方法区,如图
第三步:public static void main(String[] args) ;调用SxtStu类中的main()方法,是程序执行的入口;在栈中创建一个main()方法的栈桢,如图
第四步:new SxtStu(); 调用构造方法lSxtStu(),在堆中创建新的栈桢,根据堆中类的信息,在堆中创建一个对象,该对象有类中的属性和方法,暂时值为null,没有赋值,如图。
第五步:SxtStu stu = new SxtStu(); =赋值,将该对象的地址赋值给 stu,这样可以通过stu找到该对象,或者stu就是该对象了
第六步: stu.sname= “高淇”;stu.age = 18; 给对象的属性赋值,其中sname的字符串在方法区中找,如图
第七步:Computer c1 = new Computer();类似上边,调用 Computer()方法创建对象,将该对象赋值给c1,将方法区中的 “联想” 赋值给bread
第八步:执行stu.comp = c1; 将c1的值赋值给comp ,内存如图
第九步:调用 stu.play();stu.study(); 如图是内存运行过程