JVM与Java体系结构

虚拟机与Java虚拟机

虚拟机

虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

VMware就属于系统虚拟机,它们完全是对物理计算机硬件的仿真(模拟),提供了一个可运行完整操作系统的软件平台。

程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。

Java虚拟机

Java虚拟机是一台执行Java字节码的虚拟计算机,现在JVM跨语言平台,不光能解释Java字节码,准确的说任何能在jvm平台上执行的字节码格式(其他语言编译的字节码)都是一样的。所以应该统称为Jvm字节码

JVM平台的各种语言可以共享Java虚拟机带来的

  • 跨平台性
  • 优秀的垃圾回器
  • 以及可靠的即时编译器

Java技术的核心就是Java虚拟机(JVM,Java Virtual Machine),因为所有的Java程序都运行在Java虚拟机内部。

作用:

Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。

特点:

  • 一次编译,到处运行(字节码文件)
  • 自动内存管理
  • 自动垃圾回收功能

JVM的位置

JVM是运行在操作系统之上的,它与硬件没有直接的交互

JDK(Java Development Kit) Java开发工具包:是提供给Java开发人员使用,其中包含了java的开发工具与JRE --> JDK = JRE + 开发工具集(如编译器javac.exe,java.exe,javadoc.exe)

JRE(Java Runtime Environment) Java运行环境:包括java虚拟机和java程序所需的核心类库等,如果想要运行一个开发好的Java程序,只需要JRE即可 --> JRE = JVM + Java SE标准类库

JVM的整体结构

类加载器子系统:将编译好的.Class文件加载到JVM中

运行时数据区:存储在JVM运行过程中产生的数据,包括程序计数器、方法区、本地方法去、虚拟机栈和虚拟机堆

执行引擎:即时编译器将Java字节码编译成具体的机器码,垃圾回收器回收在运行过程中不再使用的对象

**本地接口库用于调用操作系统的本地方法库完成具体的指令操作。

Java代码执行流程

主流编译器采用解释执行与编译执行并存的方式

解释器:保证响应时间

编译器:字节码中的热点(反复执行)指令直接编译成机器指令缓存,保证执行性能

1.Java源文件(.java)被编译器编译成字节码文件(.class)

2.JVM将字节码文件编译成相应操作系统的机器码

3.机器码调用相应操作系统的本地方法库执行相应的方法

Java跨平台的原因

每个操作系统的解释器都是不同的,但基于解释器实现的虚拟机时相同的

JVM的架构模型

Java编译器输入的指令流基本上是一种基于栈的指令集架构,因为跨平台性的设计,另外一种指令集架构则是基于寄存器的指令集架构

基于栈的指令级架构

基于栈式架构的特点:

设计和实现更简单,适用于资源受限的系统;

避开了寄存器的分配难题:使用零地址指令方式分配

指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现

不需要硬件支持,可移植性更好,更好实现跨平台

栈:跨平台性、指令集小、指令多,执行性能比寄存器差

基于寄存器的指令级架构

基于寄存器架构的特点:

典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。

指令集架构则完全依赖硬件,与硬件的耦合度高(指令直接由CPU执行),可移植性差

性能优秀和执行更高效

花费更少的指令去完成一项操作

在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主

两种架构的举例

同样执行2+3这种逻辑操作,其指令分别如下:

基于栈的计算流程(以Java虚拟机为例):

iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈

8个指令

而基于寄存器的计算流程

mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3

2个指令

JVM的生命周期

在一个Java进程开始运行后,虚拟机就开始实例化了,有多个进程启动就会实例化多个虚拟机实例。进程退出或者关闭,则虚拟机实例消亡,虚拟机实例之间不能共享数据。

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

类加载器的作用

  1. 类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问接口。
  2. 类缓存:某个类被加载到类加载器中,它将维持加载(缓存)一段时间。

自定义类加载器 -> 系统类加载器 -> 扩展类加载器 -> 引导类加载器

系统类加载器AppClassLoader:自己定义的类

扩展类加载器:负责jre(Java Runtime Environment)/lib/ext目录下的jar包或

引导类加载器(bootstrap class loader):负责java平台核心库的加载,该加载器无法直接获取。无法加载自定义类。

虚拟机的执行

一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序

程序开始执行时他才运行,程序结束时他就停止

执行一个所谓的Java程序的时候,真真正正在执行的是Java虚拟机进程

虚拟机的退出

有如下的几种情况:

程序正常执行结束

程序在执行过程中遇到了异常或错误而异常终止

由于操作系统用现错误而导致Java虚拟机进程终止

某线程调用Runtime类或System类的exit()方法,或Runtime类的halt()方法,并且Java安全管理器也允许这次exit()或halt()操作。

JVM1 JVM与Java体系结构的更多相关文章

  1. 【JVM之内存与垃圾回收篇】JVM与Java体系结构

    JVM与Java体系结构 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM! 想解决线上JVM GC问题,但却无从下手. 新 ...

  2. JVM解毒——JVM与Java体系结构

    你是否也遇到过这些问题? 运行线上系统突然卡死,系统无法访问,甚至直接OOM 想解决线上JVM GC问题,但却无从下手 新项目上线,对各种JVM参数设置一脸懵逼,直接默认,然后就JJ了 每次面试都要重 ...

  3. JVM与Java体系结构

    参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...

  4. JVM上篇:JVM与Java体系结构

    JVM笔记 JVM传言 Java不是最强大的语言,但是JVM是最强大的虚拟机 虚拟机分类 系统虚拟机 类似VMware,就属于系统虚拟机,它提供了一个可运行完整操作系统的平台 程序虚拟机 Java虚拟 ...

  5. <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  6. 1_JVM与Java体系结构

    目录 JVM与Java体系结构 前言 架构师每天都在思考什么? 为什么要学习JVM Java vs C++ 推荐书籍 Java生态圈 字节码 多语言混合编程 Java发展的重大事件 虚拟机与Java虚 ...

  7. jvm的内部体系结构浅析

    转自:http://www.cnblogs.com/evan2012/archive/2012/05/09/2489417.html 1.jvm的内部体系结构浅析 2.jvm的几个运行时数据区域 3. ...

  8. 深入Java虚拟机(1)——Java体系结构

    Java体系结构 Java体系结构包括四个独立但相关的技术: 1.Java程序设计语言 2.Java class文件格式 3.Java应用编程接口(API) 4.Java虚拟机 当编写并运行一个Jav ...

  9. java体系结构与工作方式 《深入分析java web 技术内幕》第七章

    java体系结构与工作方式 7.1 JVM体系结构 何谓JVM JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能 指令集:计算机所能识别的机器语言 ...

随机推荐

  1. CPU使用率和平均负载

    转载: https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487782&idx=3&sn=3f04bb053d ...

  2. SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡

      Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡.为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求.Ribbo ...

  3. 算法学习->求解三角形最小路径

    00 问题 00-1 描述 对给定高度为n的一个整数三角形,找出从顶部到底部的最小路径和.每个整数只能向下移动到与之相邻的整数. 找到一个一样的力扣题:120. 三角形最小路径和 - 力扣(LeetC ...

  4. 对于multitaper多窗口谱估计的理解及步骤 (对应matlab中pmtm函数)谱减法相关

    对于多窗口谱估计的理解 目录 对于多窗口谱估计的理解 0. 缘起 1. PMTM 含义 2. 与我们常用的周期谱估计的区别 3. 计算过程 5. 多窗/单窗谱估计结果对比 6. 程序如何生成多窗 - ...

  5. Redis 专栏(使用介绍、源码分析、常见问题...)

    一.介绍相关 说Redis : 介绍Redis特性,使用场景,使用Jedis操作Redis等. 二.源码分析 1. 数据结构 Redis源码分析(sds):Redis自己封装的C语言字符串类型. Re ...

  6. robot_framewok自动化测试--(2)创建第一个项目

    创建第一个robot_framewok项目 通过 RIDE 去学习和使用 Robot Framework 框架,对于初学者来说大大的降低了学习难度.所以后面对 Robot Framework 框架都将 ...

  7. robot_framewok自动化测试--(1)Robot Framework 环境搭建及常见日志问题解决办法

    一.Robot Framework 介绍 Robot Framework 的架构是一个通用的验收测试和验收测试驱动开发的自动化测试框架(ATDD).它具有易于使用的表格来组织测试过程和测试数据. 它使 ...

  8. Go defer 原理和源码剖析

    Go 语言中有一个非常有用的保留字 defer,它可以调用一个函数,该函数的执行被推迟到包裹它的函数返回时执行. defer 语句调用的函数,要么是因为包裹它的函数执行了 return 语句,到达了函 ...

  9. lombok标签之@Data @AllArgsConstructor @@NoArgsConstructor -如何去除get,set方法。@Data注解和如何使用,lombok

    在代码中我们可以只加上标签@Data 而不用get,set方法: val : 和 scala 中 val 同名, 可以在运行时确定类型; @NonNull : 注解在参数上, 如果该类参数为 null ...

  10. Python编程环境设置

    第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...