1.类加载子系统
负责从文件系统或网络中加载Class信息
2.方法区
存放加载的类信息,jdk1.7之前称为永久代(Perm),1.8之后为元数据区(Metaspace)
☞也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。
☞运行时常量池:是方法区的一部分,其中的主要内容来自于JVM对Class的加载。
☞Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。
3.Java堆
在虚拟机启动时建立,几乎所有的Java对象实例都存在堆中,所有线程共享
☞GC堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。
☞其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,-Xmx为JVM可申请的最大内存。
☞由于现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代由S0和S1构成,可通过-Xmn参数来指定新生代的大小。
☞所有对象实例以及数组都在堆上分配。
☞Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。
4.直接内存
系统的直接内存区域,访问该部分的速度优于Java堆
5.垃圾回收系统
对方法区,Java堆和直接内存的垃圾对象进行回收
6.Java栈(Java虚拟机栈)
每个线程都有一个私有的栈,栈中保存着帧信息,局部变量,方法参数,与方法调用和返回密切相关
☞线程私有的,它的生命周期与线程相同
☞每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
☞局部变量表存放各种基本数据类型boolean、byte、char、short等
7.本地方法栈
本地方法栈则是为Native方法服务
8.PC寄存器(程序计数器)
是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。
9.执行引擎
执行虚拟机的字节码