栈 stack
- 栈是方法执行的内存模型,每个方法的调用都会创建一个栈帧,用来存储局部变量,操作数,方法出口等。
- 栈是系统自动分配,是一块连续的内存空间。
- 栈是线程私有,不能线程之间共享。
- 栈符合“先进后出,后进先出”的原则。
- 每一个线程会有一个栈,用于存放执行方法的信息,比如,实参,局部变量等。
堆 heap
- 用于存放创建好的对象。
- JVM里面只有一个堆,被所有线程使用。
- 堆是一块内存不连续的空间。
方法区 method area (静态区)
- JVM里面只有一个方法区,被所有线程共享。
- 方法区本质是堆,用于存储常量,存储类的相关信息。
- 用来存放不变的内容(字符串常量,静态变量,静态方法等)。
代码示例
public class TestClass {
int num;
String name;
int age;
Favor fa;
void book() {
System.out.println(fa.book);
}
public static void main(String[] agrs){
TestClass stu = new TestClass();
Favor fav = new Favor();
fav.book = "java程序设计";
stu.fa = fav;
System.out.println(stu.fa.book);
stu.book();
}
}
class Favor {
String game;
String book;
String sport;
}
内存分配结构图: