JVM是做什么的
JVM是Java Virtual Machine(Java虚拟机)的缩写, 简单来讲,JVM作用就是将Java编译后的class文件解析成机器可以识别的跨平台的字节码并执行。之所以Java可以跨平台运行,是因为JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JRE/JDK/JVM的关系
JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。
JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。
JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。
JVM运行时数据区
数据 :方法区 Heap(堆)
指令 :程序技术器 虚拟机栈 本地方法区
程序计数器
指向当前线程正在执行的字节码的指令地址,实际作用就是当CPU被其他线程占用后再回来执行时会接着之前程序继续执行,可以理解为记忆功能。
虚拟机栈
指向当前线程运行方法所需要的数据、指令、返回地址。 java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候都会创建一个栈帧用于存储局部变量表,操作数栈(进行数值运算,例如sum=i+j,i,j分别压栈进行计算后将sum存储在操作数栈),动态链接(链接类的实例),方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程。
方法区
存储类信息,常量,静态变量,JIT,类的方法代码,方法名,访问权限,返回值。
堆
Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象(包括成员变量)。
在 Java 中,堆被划分成不同的区域:新生代 ( Young )、老年代 ( Old )等。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor.默认的,Eden : from : to = 8 : 1 : 1(实现资源利用率最大化)
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。
堆的内存模型大致为:
JDK<1.8
JMM : young | old | 永久代
JDK=1.8
JMM :young | old | Meta space(可伸缩)
网友评论