1.1. 类加载子系统
类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间。方法区中可能还会存放运行时常量信息,包括字符串与数字常量。(这部分常量信息是Class文件中常量池部分的内存映射)。java
1.2. JAVA堆
JAVA的堆在JVM启动的时候创建,几乎全部的Java对象实例都存放于Java堆中。堆空间是全部线程共享的。根据垃圾回收机制的不一样,JAVA堆有可能拥有不一样的结构。最为常见的一种结构是将整个堆分为新生代和老年代以及持久代。 网络
对象首先分配在eden区,在一次Young GC后,若是对象还存活则会进入S0(from)或者S1(to).以后每次Young GC后若是对象存活,它的年龄就会加1,当对象年龄达到必定条件后,就会被认定为是老年对象,从而进入老年代。数据结构
package com.hl.heap;函数
public class SimleHeap {性能
public int id; public SimleHeap(int id) { this.id = id; } public void show(){ System.out.println("My ID is " + id); } public static void main(String[] args) { SimleHeap s1 = new SimleHeap(1); SimleHeap s2 = new SimleHeap(2); s1.show(); s2.show(); }
}优化
SimpleHeap类的信息存放在方法区,主函数中的s1和s2存放在JAVA栈中,而且指向堆中的两个实例。this
1.3. 直接内存
JAVA的NIO容许java程序使用直接内存,直接内存是在JAVA堆外的,直接向系统申请的内存空间。一般访问直接内存的速度要优于JAVA堆,直接内存适用于频繁读写的场景,直接内存在JAVA堆外,所以它的大小不会直接受限于Xmx指定的最大堆大小的限制,可是JAVA堆和直接内存依然受限于系统的最大内存。spa
1.4. 垃圾回收系统
垃圾回收器可对方法区、JAVA堆和直接内存进行回收。线程
1.5. JAVA栈
每一个JVM线程都有一个私有的JAVA栈,JAVA栈在线程建立的时候建立。JAVA栈中保存着局部变量、方法参数、同时和JAVA方法的调用、返回密切相关。指针
1.5.1 函数调用-出入JAVA栈
栈是线程私有的内存空间,线程执行的基本行为是函数调用,每次函数调用的数据都是经过JAVA栈传递的。JAVA栈是一块先进后出的数据结构,只支持出栈入栈两种操做。在JAVA栈中保存的主要内容为栈帧。每一次函数调用,都会有一个对应的栈帧被压入JAVA栈,每个函数调用结束,都会有一个栈帧被弹出JAVA栈。JAVA方法有两种返回函数的方式,一种是正常的return,一个是抛出异常,无论哪一种方式,都会致使栈被弹出。在一个栈中,至少要包含局部变量表、操做数栈和帧数据区几个部分。JVM提供了-Xss指定线程栈的最大空间,这个参数决定了函数调用的最大深度。
JAVA栈的结构
1.5.1.1 局部变量表
它用于保存函数的参数以及局部变量,局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。因为局部变量表在栈帧中,若是函数的参数与局部变量较多,会使得局部变量表膨胀,从而每一次函数调用就会占用更多的栈空间,最终致使函数的嵌套调用次数减小。
1.5.1.2 操做数栈
主要用于保存计算过程当中的中间结果,同时做为计算过程当中变量的临时存储空间。操做数栈也是一个先进后出的数据结构,只支持入栈和出栈两种操做。
1.5.1.3 帧数据区
帧数据区中保存着返回常量池的指针,方便程序访问常量池。当函数返回或者出现异常时,虚拟机必须恢复调用者函数的栈帧,并让调用者函数继续执行下去,虚拟机必须有一个异常处理表,方便在发生异常时找处处理异常的代码,所以异常处理表也是帧数据区中重要的一部分。
1.5.1.4 栈上分配
是JVM优化的一项技术,对于哪些线程的私有对象,能够将它们打散分配在栈上,而不是分配在堆上。当函数调用结束后能够自行销毁,不须要GC介入,从而提升系统性能。
1.6. 方法区
和JAVA堆同样,方法区是一块全部线程共享的内存区域。它用于保存系统的类信息,好比类的字段、方法、常量池等,方法区的大小决定了系统能够保存多少个类。在JDK1.7中方法区能够理解为永久区在JDK1.8中永久区被完全移除,取而代之的是元数据区,元数据区是一块堆外的内存,与持久区不一样的是,若是不指定元数据区大小,虚拟机会消耗系统内存,直到耗尽为止。
1.7. 本地方法栈
本地方法栈和java栈很是相似,最大的不一样在于java栈用于java方法的调用,而本地方法栈则用于调用本地方法(dll,so)。
1.8. PC(Program Counter)寄存器
也是每一个线程私有空间,Java虚拟机会为每一个Java线程建立PC寄存器。在任意时刻,一个Java线程老是在执行一个方法,这个正在被执行的方法称为当前方法。若是当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。若是当前方法是本地方法,那么PC寄存器的值就是undefined。
1.9. 执行引擎负责执行虚拟机的字节码