是什么?
JVM(java virtual machine),它是运行java字节码的虚拟机。包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。它是运行在操作系统之上的。
基本结构
JVM主要有三个主要的子系统构成,包括类加载子系统、运行时数据区、执行引擎。如下图显示
运行时数据区
JVM内存区域主要分为线程私有的【程序计数器、虚拟机栈、本地方法栈】和线程公有【方法区、Heap】。结构图如下:
注:线程私有数据区域生命周期是跟随者线程共存亡,不需要垃圾器回收;而线程公有的是根据虚拟机的启动/关闭而创建/销毁的。
1.程序计数器
它是当前线程所执行的字节码的行号指示器,存储程序下一个执行的字节码。是线程私有的。如果是正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址,如果还是Native,然后就是空。
2.虚拟机栈
是描述的java方法执行的内存模型,每个方法在知识性的同时都会创建一个栈帧,然后用来存储局部变量表、动态了解、操作数栈、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机入栈中到出栈的过程。
3.本地方法栈
类似于虚拟机栈。他们的区别只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用的Native服务。
4.Java堆
虚拟机启动时自动分配创建,用于存放对象的实例,然后几乎所有对象,都是在堆上分配内存,同样也是垃圾回收主要的区域。
5.方法区
包括存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。成为堆的一个逻辑部分,所以别名也成非堆;