一、内存分配的区域
Java虚拟机在运行时的数据区域包括:
Method Area(方法区)
VM stack(虚拟机栈)
Native Method Stack(本地方法栈)
Heap(堆)
Program Counter Register (程序计数器)
二、常用区域的理解
1、方法区
方法区是线程的共享区域,用于存储已经被虚拟机加载的类信息,常量(常量池 )和静态变量(静态域)即编译器编译后的代码数据。
2、虚拟机栈
虚拟机栈描述的是方法执行的内存模型。通常所说的虚拟机运行时分为堆和栈中的“栈”就是虚拟机栈,或者说是虚拟机栈中的局部变量表部分,线程私有,生命周期与线程相同。
存放变异期可知的基本数据类型(int short long double float char byte boolean )的数据(如 int a = 9;a,9 都在栈中)、
存放对象的引用(如 ClassA a = new ClassA(); a存在栈中)和类型、
方法中的局部变量等;
栈中的内容在退出该生效的作用域后,该内存空间可以被做他用。
优点:栈中数据的存取速度快
3、堆
堆是Java虚拟机所管理的内存中的最大一块,是运行时动态分配的内存,存放new出来的对象实例
是垃圾回收的主要区域。由所有线程共享的区域。
4、程序计数器
Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了线程切换后能恢复到正常的执行位置,每条线程都需要有一个独立的计数器,各条线程之间的计数器互不影响,独立存储。
(疑问:线程结束之后,程序计数器的内存会不会回收?)