网站开发方案及报价,中山免费建站,wordpress分类404,wordpress 转小程序目录
1.JVM 简介
2.JVM 执行流程
3. JVM 运行时数据区 3.1 堆#xff08;线程共享#xff09;
3.3 本地方法栈#xff08;线程私有#xff09;
3.4 程序计数器#xff08;线程私有#xff09;
3.5 方法区#xff08;线程共享#xff09;
4.JVM 类加载
① 类…目录
1.JVM 简介
2.JVM 执行流程
3. JVM 运行时数据区 3.1 堆线程共享
3.3 本地方法栈线程私有
3.4 程序计数器线程私有
3.5 方法区线程共享
4.JVM 类加载
① 类加载过程
1) 加载
2) 验证
3) 准备
4) 解析
5) 初始化
② 双亲委派模型
双亲委派模型的优点 1.JVM 简介 JVM 是 Java Virtual Machine 的简称意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机 JVM 、 VMwave 、 Virtual Box 2.JVM 执行流程 程序在执行之前先要把java代码转换成字节码class文件JVM 首先需要把字节码通过一定的方式 类加载器ClassLoader 把文件加载到内存中 运行时数据区Runtime Data Area 而字节码文件是 JVM 的一套指令集规范并不能直接交个底层操作系统去执行因此需要特定的命令解析器 执行引擎Execution Engine将字节码翻译成底层系统指令再交由CPU去执行而这个过程中需要调用其他语言的接口 本地库接口Native Interface 来实现整个程序的功能这就是这4个主要组成部 分的职责与功能。 3. JVM 运行时数据区 JVM 运行时数据区域也叫内存布局但需要注意的是它和 Java 内存模型 (Java Memory Model 简称 JMM完全不同属于完全不同的两个概念它由以下 5 大部分组成 3.1 堆线程共享 堆的作用程序中创建的所有对象new都在保存在堆中 堆里面分为两个区域新生代和老生代新生代放新建的对象当经过一定 GC 次数之后还存活的对象会放入老生代。新生代还有 3 个区域一个 Endn 两个 Survivor S0/S1 。 3.2 Java虚拟机栈线程私有 Java 虚拟机栈的作用 Java 虚拟机栈的生命周期和线程相同 Java 虚拟机栈描述的是 Java 方法执行的内存模型每个方法在执行的同时都会创建一个 栈帧 Stack Frame 用于 存储局部变表、操作数栈、动态链接、方法出口等信息 。咱们常说的堆内存、栈内存中栈内存指的就是虚拟栈。 Java 虚拟机栈中包含了以下 4 部分 3.3 本地方法栈线程私有 本地方法栈和虚拟机栈类似只不过 Java 虚拟机栈是给 JVM 使用的而本地方法栈是给本地方法使用 的。 3.4 程序计数器线程私有 程序计数器的作用用来记录当前线程执行的行号的。 程序计数器是一块比较小的内存空间可以看做是当前线程所执行的字节码的行号指示器。 如果当前线程正在执行的是一个Java 方法这个计数器记录的是正在执行的虚拟机字节码指令的地址 如果正在执行的是一个Native 方法这个计数器值为空。 什么是线程私有? 由于JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现因此在任何一个确定的时 刻一个处理器(多核处理器则指的是一个内核)都只会执行一条线程中的指令。因此为了切换线程后能 恢复到正确的执行位置每条线程都需要独立的程序计数器各条线程之间计数器互不影响独立存 储。我们就把类似这类区域称之为线程私有的内存。 3.5 方法区线程共享 方法区的作用用来存储被虚拟机加载的类信息、常量、静态变量(static)、即时编译器编译后的代码等数据 的。 在 HotSpot 虚拟机的实现中在 JDK 7 时此区域 叫做永久代PermGenJDK 8 中叫做元空间Metaspace。 运行时常量池 运行时常量池是方法区的一部分存放字面量与符号引用。 字面量 : 字符串 (JDK 8 移动到堆中 ) 、 final 常量、基本数据类型的值。 符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。 4.JVM 类加载
① 类加载过程 对于一个类来说它的生命周期是这样的
1) 加载 “加载 ” Loading 阶段是整个 “ 类加载 ” Class Loading 过程中的一个阶段它和类加载 Class Loading 是不同的一个是加载 Loading 另一个是类加载 Class Loading 所以不要把二者搞混了。 在加载 Loading 阶段 Java 虚拟机需要完成以下 三件事情 1 通过一个类的全限定名来获取定义此类的二进制字节流。 2 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 3 在内存中生成一个代表这个类的 java.lang.Class 对象作为方法区这个类的各种数据的访问入口。 2) 验证 验证是连接阶段的第一步这一阶段的目的是确保Class 文件的字节 流中包含的信息符合《 Java虚拟机 规范》的全部约束要求保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。 验证选项 文件格式验证 字节码验证 符号引用验证... 3) 准备 准备阶段是正式为类中定义的变量即静态变量被static 修饰的变量分配内存并设置类变量初始值 的阶段。 比如此时有这样一行代码 public static int value 123; 它是初始化 value 的 int 值为 0 而非 123 。 4) 解析 解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程也就是初始化常量的过程。 5) 初始化 初始化阶段Java 虚拟机真正开始执行类中编写的 Java 程序代码将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。 ② 双亲委派模型 如果一个类加载器收到了类加载的请求它首先不会自己去尝试加载这个类而是把这个请求委派给父 类加载器去完成每一个层次的类加载器都是如此因此所有的加载请求最 终都应该传送到最顶层的启 动类加载器中只有当父加载器反馈自己无 法完成这个加载请求它的搜索范围中没有找到所需的类 时子加载器才会尝试自己去完成加载。 双亲委派模型的优点 1. 避免重复加载类比如 A 类和 B 类都有一个父类 C 类那么当 A 启动时就会将 C 类加载起来那 么在 B 类进行加载时就不需要在重复加载 C 类了。 2. 安全性使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改如果没有使用双亲委派模 型而是每个类加载器加载自己的话就会出现一些问题比如我们编写一个称为 java.lang.Object 类的话那么程序运行的时候系统就会出现多个不同的 Object 类而有些 Object 类又是用户 自己提供的因此安全性就不能得到保证了。