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. rsyslog日志收集器

    rsyslog详解(思维导图) 1. 日志收集概述 1.1 日志记录 时间 事件 1.2 日志收集器 syslog rsyslog elk stack 1.3 日志文件 文件记录的日志格式 其他日志文 ...

  2. Android学习笔记添加ActionItem

    ActionItem概念 案例仿知乎首页的ActionBar 一.编写布局文件activity_main.xml <?xml version="1.0" encoding=& ...

  3. 力扣:二叉树着色游戏(DFS详解)

    有两位极客玩家参与了一场「二叉树着色」的游戏.游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同. 游戏从「一号」玩家开始(「一号 ...

  4. PN532资料 NFC RFID V3模块

    最新PN532链接:  https://pan.baidu.com/s/1HyXk-VuF-24ZJ8zAVb9lcA 提取码: bgju 复制这段内容后打开百度网盘手机App,操作更方便哦

  5. Linux环境下搭建禅道

    如何在Linux下搭建禅道 查看Linux版本信息 # cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 禅道官网下载Linux ...

  6. 1169A+B问题终结版(高精度计算)

    描述 给定两个整数A和B,输出A+B的值.A和B的值可能会很大很大,甚至达到100位.现在请你解决这一问题. 输入 两行,分别是两个整数A,B,换行隔开.A和B会很大很大. 输出 一个整数,即A+B的 ...

  7. <react> 组件的详细介绍:

    <react> 组件的详细介绍: 思维导图: 代码介绍: TodoList:(组件) import React, { Component } from 'react' import Sty ...

  8. c语言中的c语言中realloc()函数解析

    c语言中realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚. realloc(void *__ptr, size_t ...

  9. druid18.1版本sing-server启动报错

    正文 昨天下载了一个18版本的driud打算在虚拟机探究一下,然后按照官网的启动方式启动了,每个失败.官网是/bin/start-micro-quickstart,我们去看他的单机启动配置 http: ...

  10. vue全家桶(2.2)

    3.3.router-link配置 3.3.1.实例 需求:实现下面效果,点击不同的菜单,显示不同的文字 核心代码:App组件 <template> <div id="ap ...