汇报人:陈琦帆JVM汇报人:陈琦帆JVM简介—目录•Java虚拟机和Java内存区域概述•Java虚拟机栈和本地方法栈•Java堆•方法区和运行时常量池Java虚拟机和Java内存区域概述•什么是虚拟机,什么是Java虚拟机•Java虚拟机基础架构•Java虚拟机运行时数据区•程序计数器区域Java虚拟机和Java内存区域概述—什么是虚拟机,什么是Java虚拟机虚拟机•定义:模拟某种计算机体系结构,执行特定指令集的软件•系统虚拟机(VirtualBox、VMware),进程虚拟机进程虚拟机•JVM、AdobeFlashPlayer、FC模拟器高级语言虚拟机•JVM、.NETCLR、P-CodeJava虚拟机和Java内存区域概述—什么是虚拟机,什么是Java虚拟机Java语言虚拟机•可以执行Java语言的高级语言虚拟机。Java语言虚拟机并不一定就可以称为JVM,譬如:ApacheHarmonyJava™虚拟机•必须通过JavaTCK(TechnologyCompatibilityKit)的兼容性测试的Java语言虚拟机才能称为“Java™虚拟机”•Java™虚拟机并非一定要执行“Java”程序•业界三大商用JVM:OracleHotSpot、OracleJRockitVM、IBMJ9VMJava虚拟机和Java内存区域概述—JAVA虚拟机架构该图参考了网上广为流传的JVM构成图,大家看这个图,整个JVM分为四部分:ClassLoader类加载器ExecutionEngine执行引擎NativeInterface本地接口Runtimedataarea运行数据区Java虚拟机和内存区域概述—Java虚拟机运行时数据区运行时数据区的划分•程序计数器•Java堆•Java虚拟机栈•本地方法栈•方法区Java虚拟机和内存区域概述—程序计数器区域程序计数器(ProgramCounterRegister)•一块较小的的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。•如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。•此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。JVM自动内存管理:内存区域基础概念Java虚拟机栈和本地方法栈Java虚拟机栈和本地方法栈•Java虚拟机栈的概念和特征•本地方法栈的概念和特征•栈帧概念和特征•本地变量表和操作数栈实战•内存异常实战Java虚拟机栈和本地方法栈—Java虚拟机栈的概念和特征Java虚拟机栈的特征•线程私有•后进先出(LIFO)栈•存储栈帧,支撑Java方法的调用、执行和退出•可能出现OutOfMemoryError异常和StackOverflowError异常Java虚拟机栈和本地方法栈—本地方法栈的概念和特征Java本地方法栈的特征•线程私有•后进先出(LIFO)栈•作用是支撑Native方法的调用、执行和退出•可能出现OutOfMemoryError异常和StackOverflowError异常•有一些虚拟机(如HotSpot)将Java虚拟机栈和本地方法栈合并实现Java虚拟机和内存区域概述—栈帧概念和特征栈帧的概念和特征•Java虚拟机栈中存储的内容,它被用于存储数据和部分过程结果的数据结构,同时也被用来处理动态链接、方法返回值和异常分派•一个完整的栈帧包含:局部变量表、操作数栈、动态连接信息、方法正常完成和异常完成信息Java虚拟机和内存区域概述—栈帧概念和特征局部变量表概念和特征•由若干个Slot组成,长度由编译期决定•单个Slot可以存储一个类型为boolean、byte、char、short、float、reference和returnAddress的数据,两个Slot可以存储一个类型为long或double的数据。•局部变量表用于方法间参数传递,以及方法执行过程中存储基础数据类型的值和对象的引用Java虚拟机和内存区域概述—栈帧概念和特征操作数栈的概念和特征•是一个后进先出栈,由若干个Entry组成,长度由编译期决定•单个Entry即可以存储一个Java虚拟机中定义的任意数据类型的值,包括long和double类型,但是存储long和double类型的Entry深度为2,其他类型的深度为1•在方法执行过程中,栈帧用于存储计算参数和计算结果;在方法调用时,操作数栈也用来准备调用方法的参数以及接收方法返回结果Java虚拟机栈和本地方法栈—栈帧实战通过一个具体例子来演示栈帧的局部变量表和操作数栈的工作方式Java虚拟机栈和本地方法栈—内存异常实战Java虚拟机栈和本地方法栈可能发生如下异常情况:•如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出一个StackOverflowError异常。•如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成扩展,或者在建立新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常。Java虚拟机栈和本地方法栈—内存异常实战虚拟机栈栈溢出的实例演示JVM自动内存管理:内存区域基础概念Java堆Java堆•Java堆的概念•栈与堆•Java堆内存异常实战Java堆—Java堆的概念Java堆的特征•全局共享•通常是Java虚拟机中最大的一块内存区域•作用是做为Java对象的主要存储区域•JVMS明确要求该区域需要实现自动内存管理,即常说的GC,但并不限制采用哪种算法和技术去实现•可能出现OutOfMemoryError异常Java堆—栈与堆从栈到堆的关联过程:Objectobj=newObject()Java堆—Java堆内存异常实战Java堆可能发生如下异常情况:•如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常。JVM自动内存管理:内存区域基础概念方法区和运行时常量池方法区和运行时常量池•方法区的概念•运行时常量池的概念•HotSpot方法区实现的变迁•方法区内存异常实战方法区和运行时常量池—方法区的概念方法区的特征•全局共享•作用是存储Java类的结构信息•JVMS不要求该区域实现自动内存管理,但是商用Java虚拟机都能够自动管理该区域的内存•可能出现OutOfMemoryError异常方法区和运行时常量池—运行时常量池的概念运行时常量池的特征•全局共享•是方法区的一部分•作用是存储Java类文件常量池中的符号信息•可能出现OutOfMemoryError异常方法区和运行时常量池—HotSpot方法区实现的变迁永久代与方法区•在JDK1.2~JDK6,HotSpot使用永久代实现方法区•在JDK7开始,HotSpot开始了移除永久的代计划-符号表被移到NativeHeap中-字符串常量和类的静态引用被移到JavaHeap中•在JDK8开始,永久代已被元空间(Metaspace)所代替