Jvm的内存结构。
废话不多说,先上一张图
jvm的主要组成部分:
- 程序计数器(Program Counter Register)
- 虚拟机栈(VM Stack)
- 本地方法栈(Native Method Stack)
- 方法区(Method Area)
- 堆(Heap)
咱们分别来说说其作用:
程序计数器(Method Area)
顾名思义,就是计数用的,这个“数”指的就是程序下一个要执行的指令的位置(内存地址)。值得一提的是它是线程私有的,就是说在多线程环境下,每个线程都有自己的计数器,互相不会干扰。如果正在执行的是Native方法,那它的值为空。
虚拟机栈(VM Stack)
虚拟机栈和计数器一样,也是线程私有的。用来存储方法数据和部分运算结果,每当程序调用一个方法,就会触发入栈,这个方法返回时触发出栈,进出方式为“后入先出”。
本地方法栈(Native Method Stack)
和上面虚拟栈的功能一模一样,区别就是虚拟栈为java方法服务,这个为Native方法服务。
方法区(Method Area)
类(class)的信息都会储存在这里。当类加载器从类文件中提取信息之后,就会将其存到这里。咱们下一节聊聊类的加载机制。
和上面几个不同的是,方法区是线程共享的(显而易见)。
堆(Heap)
堆同样是线程共享的区域,所有java实例或对象都会存储在这里。也是GC(垃圾收集机制,方法区中也存在垃圾收集)大显身手的地方。
简单的介绍就到这,下节开始咱们进入正题。