JVM内存分区图文
首先看图,JVM内存里面主要干一下三件事,我们从这三件事展开,了解并掌握JVM内存分区:
方法区(元数据空间)
jdk1.8之前叫做方法区,主要放".class"文件加载进来的类,还有一些类似的常量池的东西。jdk1.8以后,改名为"Metaspace"-元数据空间。
程序计数器
我们写好的java代码会编译成字节码文件,包含各种字节码指令,然后字节码才能被JVM字节码执行引擎,一条条的去执行。
我们JVM支持多个线程,我们的代码会开启多个线程并发的执行不同的代码,每个线程都有一个程序计数器,单独记录当前对应线程执行到哪一条字节码指令了。
Java虚拟机栈(栈区)
JVM必须有一块区域是来保存每个方法的局部变量的,这个区就是栈区。
每个线程对应一个栈区,每一个线程执行了一个方法,就会创建对应方法的栈桢,压入栈底,同时,该方法里面也会存放包含在方法里面的局部变量之类的数据。以此类推,方法执行完毕则出栈。
Java堆内存(堆区)
我们在堆区存放的一个局部变量是用来存放该变量new出来对象的地址,所有new出来的对象都在堆区。
总结:
- 加载类进入内存,存放在方法区
- 然后有一个主线程执行类中的main方法,通过程序计数器关联记录。
- main方法执行,压入栈底,之后的方法依次压入
- 方法执行过程中,需要创建实例对象,栈桢中存放局部变量,堆区存放new出来的具体对象实例,局部变量存放该实例的地址。
- 方法执行完依次弹出栈