JVM体系结构图java
Native Interface(本地接口)数据结构
Java本地接口(Java Native Interface (JNI))容许运行在Java虚拟机(Java Virtual Machine (JVM))上的代码调用本地程序和类库,或者被它们调用,这些程序和类库能够是其它语言编写的,好比C、C++或者汇编语言。函数
Program Counter Register(程序计数器)线程
每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址),由执行引擎读取下一条指令,是一个很是小的内存空间,几乎能够忽略不计。指针
这块n内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器经过改变这个计数器的值来选取下一条须要执行的字节码指令。若是是一个native方法,那么这个计数器就是空的。由于native方法是java经过JNI直接调用本地C/C++库,能够近似的认为native方法至关于C/C++暴露给java的一个接口,java经过调用这个接口从而调用到C/C++方法。因为该方法是经过C/C++而不是java进行实现。那么天然没法产生相应的字节码,而且C/C++执行时的内存分配是由本身语言决定的,而不是由JVM决定的。对象
Native Method Stack(本地方法栈)blog
本地方法栈的功能和特色相似于虚拟机栈,均具备线程隔离的特色以及都能抛出StackOverflowError和OutOfMemoryError异常。接口
不一样的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法。如何去服务native方法?native方法使用什么语言实现?怎么组织像栈帧这种为了服务方法的数据结构?虚拟机规范并未给出强制规定,所以不一样的虚拟机实能够进行自由实现,咱们经常使用的HotSpot虚拟机选择合并了虚拟机栈和本地方法栈。内存
Method Area(方法区)编译器
方法区是一个被线程共享的内存区域。其中主要存储加载的类字节码、class/method/field等元数据对象、static-final常量、static变量、jit编译器编译后的代码等数据。另外,方法区包含了一个特殊的区域“运行时常量池”。
Heap(堆)
堆是 JVM 管理的最大的一块内存空间,主要用于存放Java类的实例对象.
Java Stack(java栈)
栈也叫栈内存,主管java程序的运行,是在线程建立时建立,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来讲不存在垃圾回收问题,只要线程一结束该栈就Over,声明周期和线程一致,是线程私有的。8中基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。