栈:
1、一个线程有一个栈区,栈与栈之间的数据不共享;
2、用于存基础数据类型和对象的引用;
3、栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
★方法调用栈:每一个线程都有一个方法调用栈,用于跟踪线程执行过程中方法的调用过程。栈中的每一个元素称为一个栈帧,线程每执行一个方法,就向方法调用栈压入一个新的栈帧。栈帧中存的是该方法的参数、局部变量和临时变量。
堆:
1、JVM只有一个堆区,被所有线程共享;
2、用于存对象(存的全部都是对象,不是基本数据类型和对象引用,是对象本身);
3、每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
方法区(静态区):
1、JVM只有一个方法区,被所有线程共享;
2、存着所有的class文件信息和static变量。
JVM工作过程:
1. 启动JVM进程,该进程从classpath加载相应的class文件到方法区。(先从classpath找到class文件,读取二进制字节流,存入方法区);
2. JVM定位到main方法,开始执行程序;
3. 命令执行过程中若有未加载的类,加载该类到方法区;
4. JVM为main方法中要创建的对象分配堆内存,并创建对象,对象的引用(对应类在方法区中的内存地址,指向方法区对应的类)存在当前线程的栈区,对象本身存在JVM堆区;
5. 继续执行代码,JVM根据新创建的对象的引用,定位到堆区的实例,再根据堆区实例持有的引用定位到方法区中的类信息,找到具体方法的字节码,执行。