java内存区域
上图蓝色区域表示线程共享数据区域,棕色部分代表线程私有数据区域。
- 方法区:方法区是线程共享的区域,又称为非堆——Non-heap,主要用来存储已经被加载的类的信息、常量、静态变量以及编译后的代码等数据。方法区中存在一块叫运行时常量池的区域,主要用来存放编译器生成的一些字面值和符号引用。
- JVM堆:JVM堆也是线程共享的区域,是java虚拟机中占内存最大的一块区域,主要用来存放对象,这块区域也是GC垃圾收集的主要区域。堆中又分为3个区域,分别为新生代、老年代和永久代。新生代又分为伊甸区、幸存0区和幸存1区。
- 程序计数器:每新运行一个线程,JVM会会这个线程创建一个程序计数器,程序计数器指向方法区下一个字节码指令。
- 虚拟机栈:又称方法栈,同样地,每启动一个新的线程,JVM都会为每个线程创建各自的方法栈。方法栈主要存放方法的参数和局部变量、运算过程中的临时变量等。
Java内存模型
Java内存模型中规定,所有变量都存储在主内存中,主内存是共享内存区域,所有线程都可以访问,但线程对共享变量的操作必须在工作内存中进行,因此要从主内存中拷贝一份共享变量的副本,然后对变量进行操作,再将操作的结果写回主内存。如图: