1、JVM简介java
JVM,全称Java Virtual Machine,即Java虚拟机。以Java做为编程语言所编写的应用程序都是运行在JVM上的。JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是经过在实际的计算机上仿真模拟各类计算机功能来实现的。Java有个很是重要的特色就是与平台的无关性,而JVM正是实现这一特色的关键。算法
JVM对程序的执行主要分为两个步骤,第一步是编译,即将.java的源文件编译成为.class的字节码文件,第二步是解释,JVM对字节码文件进行解释执行。两个步骤流程图分别以下两图所示:编程
2、JVM内存区域数组
JVM整个大系统又分为两个子系统。第一个是ClassLoader,即类加载器,功能是将编写的类加载到JVM中。第二个是Execution Engine,即执行引擎,负责对编译后的字节码文件进行解释执行。上述中Execution Engine又分为两部分,第一部分是Runtime data area,即运行时数据区域,即至关于JVM中的内存,第二部分是Native interface,即本地化接口,主要用于执行其余非Java编程语言编写的程序。编程语言
重点就是前者Runtime data area,它分为五个部分,分别是Method area(方法区),Heap(堆),VM stack(虚拟机栈),Program counter register(程序计数器),Native method stack(本地方法栈)。前二者线程共享,后三者线程隔离。以下图所示:spa
归纳地说,JVM初始运行的时候都会分配好Method area(方法区)和Heap(堆),而JVM 每遇到一个线程,就为其分配Program counter register(程序计数器)、VM stack(虚拟机栈)、Native method stack(本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为何把数据区域分为线程共享和线程隔离的缘由,线程隔离的那三个区域的生命周期与所属线程相同,而线程共享的区域与Java程序运行的生命周期相同,因此这也是系统垃圾回收场所只发生在线程共享的区域(实际上对大部分虚拟机来讲是发生在Heap上)的缘由。关于内存溢出异常以下图所示:操作系统
一、Method area(方法区)线程
方法区包括常量池与静态域。存放了所加载类的信息(名称、修饰符等)、类的静态变量、类的常量、类的Field信息、类的方法信息。当开发人员在程序中经过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区。对象
二、Heap(堆)blog
堆是JVM所管理的内存中最大的一块,几乎全部的对象实例和数组都在此区域,能够认为Java中全部经过new建立的对象的内存都在此分配,堆中的对象的内存须要等待GC进行回收。
三、Program counter register(程序计数器)
程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工做时经过改变该计数器的值来选择下一条须要执行的字节码指令,分支、跳转、循环等基础功能都要依赖它来实现。
四、VM stack(虚拟机栈)
虚拟机栈描述的是Java方法执行的内存模型,每一个方法在执行时都会建立一个栈帧(Stack Frame),栈帧用于存储局部变量表(基本数据类型、对象的引用等)、操做数栈、动态连接、方法返回地址和一些额外的附加信息。
五、Native method stack(本地方法栈)
该区域与虚拟机栈所发挥的做用很是类似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操做系统(Native)方法服务。
3、JVM垃圾回收
JVM的GenerationalCollecting(垃圾回收)原理是把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不一样生命周期的对象使用不一样的算法。
一般JVM内存回收老是指Heap(堆)内存回收,确实只有Heap(堆)中的内容是动态申请分配的,因此以上对象的年轻代和年老代都是指的JVM的Heap(堆)空间,而持久代则是以前提到的Method area(方法区),不属于Heap(堆)。
1. 年轻代
Java应用在分配Java对象时,这些对象会被分配到年轻代堆空间中去
这个空间大可能是小对象而且会被频繁回收
因为年轻代堆空间的垃圾回收会很频繁,所以其垃圾回收算法会更加剧视回收效率
2. 年老代
年轻代堆空间的长期存活对象会转移到(也许是永久性转移)年老代堆空间
这个堆空间一般比年轻代的堆空间大,而且其空间增加速度较缓
因为大部分JVM堆空间都分配给了年老代,所以其垃圾回收算法须要更节省空间,此算法须要可以处理低垃圾密度的堆空间
3. 持久代
存放VM和Java类的元数据(metadata),以及interned字符串和类的静态变量
当这三个分代的堆空间比较紧张或者没有足够的空间来为新到的请求分配的时候,垃圾回收机制就会起做用。有两种类型的垃圾回收方式:次收集(Minor GC)和全收集(Full GC)。当年轻代堆空间满了的时候,会触发次收集将还存活的对象移到年老代堆空间。当年老代堆空间满了的时候,会触发一个覆盖全范围的对象堆的全收集。
至此是关于浅析JVM内存区域及垃圾回收,仅供参考。
若有疏漏错误之处,还请不吝赐教!