JVM中的内存分区
JVM做为Java程序运行的基础,是Java运行时必不可少的部分。
每一个jvm启动时,都会向系统申请一大块地址,因为他就是一个虚拟机,现实生活中的电脑不也需要人们安装内存条吗?虚拟机也是一样的,只不过他的内存是向系统申请的。在申请到内存以后,jvm将所得到的内存分为三个区,分别是栈、堆、方法区。其实方法区就包括在堆中,只不过因为方法区有特别的应用,所以人们将他分开来叫。
首先投入使用的是方法区。方法区主要存放类的信息,注意是类的信息,不是对象的信息,方法区是对所有的线程共享的,他主要保存类的代码,静态变量,静态方法,字符串常量。
在方法区存入类的信息之后,jvm找到main方法,开始运行程序。一旦开始运行main方法,jvm就在栈中创建了一段包含main方法的内存,栈是对线程私有的,每一个线程都有自己的Java栈,如果在main方法中还调用了其他的方法,就将这个方法入栈,这个方法操作完成之后就出栈。
在栈中的方法运行过程中,会涉及到一些操作,比如说要创建一个对象,那这个对象就保存在堆中,堆也是对所有线程共享的,简单来说,堆就是保存对象用的,当然也会保存对象中的方法和变量。这里面还涉及到内存回收的情况,就是如果内存不足了,要优先删除哪些对象来节省空间以便完成下一步的操作,这就是jvm的垃圾回收算法,下次讲。
实例
下面是一个类源代码,先看一下
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();
}
}
下图就是这个程序在运行过程中的内存调用情况,结合前文所说的顺序,还是很容易看懂的