2.1 什么是Java虚拟机?

  1. Java虚拟机是一台执行字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
  1. JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收机制,以及可靠的即时编译器。
  1. Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部。

  |  可以这样理解

  1. JVM类似于一台小电脑运行在windows或者linux这些操作系统环境下。它与操作系统直接交互,不与硬件直接交互,操作系统可以帮我们完成和硬件交互的工作。
  1. JVM不是只支持Java字节码,只要编程语言能够遵循字节码文件的规范,都可以在JVM内运行

2.2 Java虚拟机是干什么的?

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

2.3 Java虚拟机的主要特点

  1. 一次编译,到处运行
  1. 自动内存管理
  1. 自动垃圾回收机制

  |  "一次编译,到处运行"怎么理解?

对于不同的操作系统,Oracle提供了不同版本的JVM,所以只需要将程序编译成一个.class文件,就可以运行在不同操作系统的JVM上

2.4 指令集架构模型

  1. 基于栈的指令集架构
    • 设计和实现更简单,适用于资源受限的系统;
    • 避开了寄存器的分配难题:使用零地址指令方式分配;
    • JVM指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现;
    • 不需要硬件支持,可移植性更好,更好实现跨平台。

 | 由于跨平台性的设计,Java的指令都是根据栈来设计的。

  1. 基于寄存器的指令集架构
    • 典型的应用是X86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机;
    • 基于寄存器的指令集架构则完全依赖硬件,可移植性差;
    • 性能优秀,执行更高效;
    • 花费更少的指令去完成一项操作;
    • 大部分情况下,基于寄存器架构的指令集往往都以一地址指令二地址指令三地址指令为主
  1. 二者区别:举例说明

|  寄存器执行性能更好,为什么不更改成根据寄存器来设计?

    • 不同平台CPU架构不同,为了实现跨平台性,所以不能设计为基于寄存器的;
    • 基于栈设计实现要简单一些;
    • 基于栈在非资源受限平台(嵌入式)也是可以用的,没有必要更改。

2.5 JVM的生命周期

  1. 启动
    • Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现(虚拟机有不同公司开发的不同的版本)指定的。
  1. 执行
    • 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序;
    • 程序开始执行时他才运行,程序结束时他就停止;
    • 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
  1. 退出
    • 程序正常执行结束;
    • 程序在执行过程中遇到了异常(未被捕获)或错误而异常终止;
    • 由于操作系统出现错误而导致Java虚拟机进程终止;
    • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理也允许这次exit或halt操作。
    • JNI加载或卸载Java虚拟机,Java虚拟机退出

2.6 JVM整体结构

整体结构图

详细结构图

JVM 专题二:虚拟机(二)Java虚拟机的更多相关文章

  1. JVM学习(一)Java虚拟机运行时数据区域

    一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...

  2. Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...

  3. Jvm运行时数据区 —— Java虚拟机结构小记

    关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...

  4. JVM运行时数据区--Java虚拟机栈

    虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...

  5. 【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因

    前言 JVM系列文章如无特殊说明,一些特性均是基于Hot Spot虚拟机和JDK1.8版本讲述. 下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到 ...

  6. JAVA虚拟机体系结构JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

  7. 《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...

  8. 深入理解java虚拟机【Java虚拟机类生命周期】

    C/C++等纯编译语言从源码到最终执行一般要经历:编译.连接和运行三个阶段,连接是在编译期间完成,而java在编译期间仅仅是将源码编译为Java虚拟机可以识别的字节码Class类文件,Java虚拟机对 ...

  9. Android虚拟机与Java虚拟机 两种虚拟机的比较

    在Android的体系框架中有一部分叫做Android Runtime,即Android运行时环境,这个环境包括了两个部分,一个是Android的核心类库,还有一个就是Dalvik虚拟机了. Andr ...

  10. 深入理解java虚拟机【Java虚拟机垃圾收集器】

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

随机推荐

  1. 1.Go 开始搞起

    link 1. IDE Go Land 服务器激活 2. 资源 中文网站 翻译组 翻译组wiki 待认领文章 入门指南 中文文档 fork 更新 github 中如何定期使用项目仓库内容更新自己 fo ...

  2. Redis的内存和实现机制

    1. Reids内存的划分 数据 内存统计在used_memory中 进程本身运行需要内存 Redis主进程本身运行需要的内存占用,代码.常量池等 缓冲内存,客户端缓冲区.复制积压缓冲区.AOF缓冲区 ...

  3. C#数据结构与算法系列(二):稀疏数组(SparseArray)

    1.介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组.    稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值    2.把具有不同值的元素的 ...

  4. 【JMeter_06】JMeter逻辑控制器__If控制器<If Controller>

    If控制器<If Controller> 业务逻辑: 根据表达式的结果来决定是否执行控制器下的脚本内容,与编程语言中的if判断逻辑大致相同,表达式结果为布尔值 true或false; 当表 ...

  5. 操作系统 I/O 全流程详解

    我们之前的文章提到了操作系统的三个抽象,它们分别是进程.地址空间和文件,除此之外,操作系统还要控制所有的 I/O 设备.操作系统必须向设备发送命令,捕捉中断并处理错误.它还应该在设备和操作系统的其余部 ...

  6. vc++如何知道cppdlg所关联的对话框?

    vc++ 6.0如何知道cppdlg所关联的对话框? 找a.cpp对应的a.h头文件里面找. https://blog.csdn.net/txwtech/article/details/1020824 ...

  7. mybatis-config.xml核心文件配置

    一.全局配置文件结构 configuration 配置 properties 属性:可以加载properties配置文件的信息 settings 设置:可以设置mybatis的全局属性 typeAli ...

  8. ArrayList、Vector、LinkedList 区别及底层实现

    一.ArrayList.Vector.LinkedList 三者区别 1.ArrayList  底层:是数组结构,查询快,增删慢,线程不安全,效率高.2.LinkedList底层:是链表数据结构,查询 ...

  9. 防火墙识别、负载均衡识别、waf识别

    防火墙识别: 通过发送SYN和ACK数据包并分析回包可以大概判断端口是否被防火墙过滤,对应关系如下表: Python代码实现: #!/usr/bin/python from scapy.all imp ...

  10. 入门大数据---Kylin搭建与应用

    由于Kylin官网已经是中文的了,而且写的很详细,这里就不再重述. 学习右转即可. 这里说个遇到的问题,当在Kylin使用SQL关键字时,要加上双引号,并且里面的内容要大写,这个和MySql有点区别需 ...