1.类加载子系统java
负责从文件系统或网络中加载Class信息web
2.方法区算法
存放加载的类信息,jdk1.7以前称为永久代(Perm),1.8以后为元数据区(Metaspace)数组
☞也称”永久代” ,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。能够经过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。网络
☞运行时常量池:是方法区的一部分,其中的主要内容来自于JVM对Class的加载。spa
☞Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各类符号引用,这部份内容将在类加载后放到方法区的运行时常量池中。线程
3.Java堆code
在虚拟机启动时创建,几乎全部的Java对象实例都存在堆中,全部线程共享orm
☞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.执行引擎
执行虚拟机的字节码