0%

jvm内存模型全面解析

jvm在拿到操作系统分配的内存后,将内存分成了5个区域。

按线程私有和线程共有分为:

线程私有:

  1. 栈(函数运行过程中的临时变量,存储基本类型,对象类型的指针)
  2. 本地方法栈(C++native方法运行的栈区,C++基本类型,与C++对象类型的指针)
  3. 程序计数器(指向程序当前运行的位置,字节码序列的位置)

共有(属于同一进程):

  1. 方法区(元空间)(全局静态方法、变量、类加载器,等等一些全局信息)
  2. 堆(存储实际对象)

栈的空间出栈即可清空,但是堆上创建的对象是不能够随着函数的运行完毕去清理的,因为也不知道是否有其他线程也引用了当前对象,也使用了当前地址,所以它无法进行清空,因而用到了GC机制。

堆中注意,对于对象类型,堆中存储的依然是对象类型的指针,指向在堆中对象的实际位置,直到基本类型,存储的是实际值,形象地说是一连串的对象。

除了栈和堆,还需要在意方法区。方法区什么时候起作用呢,比如说public static void main这个main函数就是存在方法区的。或者比如static Integer i = 10;这个i就是存在方法区。因为方法区也是一个全局的,所以在不同函数的栈中也可以同时的调用方法区里面的i。Main.i去调用静态变量。