jvm在拿到操作系统分配的内存后,将内存分成了5个区域。
按线程私有和线程共有分为:
线程私有:
- 栈(函数运行过程中的临时变量,存储基本类型,对象类型的指针)
- 本地方法栈(C++native方法运行的栈区,C++基本类型,与C++对象类型的指针)
- 程序计数器(指向程序当前运行的位置,字节码序列的位置)
共有(属于同一进程):
- 方法区(元空间)(全局静态方法、变量、类加载器,等等一些全局信息)
- 堆(存储实际对象)
栈的空间出栈即可清空,但是堆上创建的对象是不能够随着函数的运行完毕去清理的,因为也不知道是否有其他线程也引用了当前对象,也使用了当前地址,所以它无法进行清空,因而用到了GC机制。
堆中注意,对于对象类型,堆中存储的依然是对象类型的指针,指向在堆中对象的实际位置,直到基本类型,存储的是实际值,形象地说是一连串的对象。
除了栈和堆,还需要在意方法区。方法区什么时候起作用呢,比如说public static void main这个main函数就是存在方法区的。或者比如static Integer i = 10;这个i就是存在方法区。因为方法区也是一个全局的,所以在不同函数的栈中也可以同时的调用方法区里面的i。Main.i去调用静态变量。