JVM 专题二:虚拟机(二)Java虚拟机
2.1 什么是Java虚拟机?
- Java虚拟机是一台执行字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
- JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收机制,以及可靠的即时编译器。
- Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部。
| 可以这样理解
- JVM类似于一台小电脑运行在windows或者linux这些操作系统环境下。它与操作系统直接交互,不与硬件直接交互,操作系统可以帮我们完成和硬件交互的工作。
- JVM不是只支持Java字节码,只要编程语言能够遵循字节码文件的规范,都可以在JVM内运行

2.2 Java虚拟机是干什么的?
- Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。
- 每一条Java指令,Java虚拟机规范中都有详细的定义,如怎么取操作数,怎么处理操作数,操作结果放在哪里。
2.3 Java虚拟机的主要特点
- 一次编译,到处运行
- 自动内存管理
- 自动垃圾回收机制
| "一次编译,到处运行"怎么理解?
对于不同的操作系统,Oracle提供了不同版本的JVM,所以只需要将程序编译成一个.class文件,就可以运行在不同操作系统的JVM上

2.4 指令集架构模型
- 基于栈的指令集架构
- 设计和实现更简单,适用于资源受限的系统;
- 避开了寄存器的分配难题:使用零地址指令方式分配;
- JVM指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现;
- 不需要硬件支持,可移植性更好,更好实现跨平台。
| 由于跨平台性的设计,Java的指令都是根据栈来设计的。
- 基于寄存器的指令集架构
- 典型的应用是X86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机;
- 基于寄存器的指令集架构则完全依赖硬件,可移植性差;
- 性能优秀,执行更高效;
- 花费更少的指令去完成一项操作;
- 大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主
- 二者区别:举例说明

| 寄存器执行性能更好,为什么不更改成根据寄存器来设计?
- 不同平台CPU架构不同,为了实现跨平台性,所以不能设计为基于寄存器的;
- 基于栈设计实现要简单一些;
- 基于栈在非资源受限平台(嵌入式)也是可以用的,没有必要更改。
2.5 JVM的生命周期
- 启动
- Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现(虚拟机有不同公司开发的不同的版本)指定的。
- 执行
- 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序;
- 程序开始执行时他才运行,程序结束时他就停止;
- 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。
- 退出
- 程序正常执行结束;
- 程序在执行过程中遇到了异常(未被捕获)或错误而异常终止;
- 由于操作系统出现错误而导致Java虚拟机进程终止;
- 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且Java安全管理也允许这次exit或halt操作。
- JNI加载或卸载Java虚拟机,Java虚拟机退出
2.6 JVM整体结构
整体结构图

详细结构图

JVM 专题二:虚拟机(二)Java虚拟机的更多相关文章
- JVM学习(一)Java虚拟机运行时数据区域
一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在曾经的博客里面,我们介绍了在java领域中大部分的知识点,从最基础的java最基本的语法 ...
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- JVM运行时数据区--Java虚拟机栈
虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样 ...
- 【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
前言 JVM系列文章如无特殊说明,一些特性均是基于Hot Spot虚拟机和JDK1.8版本讲述. 下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到 ...
- JAVA虚拟机体系结构JAVA虚拟机的生命周期
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...
- 《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?
Java虚拟机是如何加载Java类的? 这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...
- 深入理解java虚拟机【Java虚拟机类生命周期】
C/C++等纯编译语言从源码到最终执行一般要经历:编译.连接和运行三个阶段,连接是在编译期间完成,而java在编译期间仅仅是将源码编译为Java虚拟机可以识别的字节码Class类文件,Java虚拟机对 ...
- Android虚拟机与Java虚拟机 两种虚拟机的比较
在Android的体系框架中有一部分叫做Android Runtime,即Android运行时环境,这个环境包括了两个部分,一个是Android的核心类库,还有一个就是Dalvik虚拟机了. Andr ...
- 深入理解java虚拟机【Java虚拟机垃圾收集器】
Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...
随机推荐
- Jenkins入门教程(一):Windos下Jenkins的安装教程
Jenkins的安装教程 Jenkins安装前的准备 1.安装jenkins前首先确保你的电脑已经安装了JDK,由于jenkins是基于java开发的 JDK下载地址 2.下载jenkins的安装包 ...
- 小师妹学JVM之:JVM的架构和执行过程
目录 简介 JVM是一种标准 java程序的执行顺序 JVM的架构 类加载系统 运行时数据区域 执行引擎 总结 简介 JVM也叫Java Virtual Machine,它是java程序运行的基础,负 ...
- 最新 iOS 框架整体梳理(三)
这一篇得把介绍框架这个系列终结了,不能超过三篇了,不然太长了..... 还是老规矩,前面两篇的机票在下方: 最新 iOS 框架整体梳理(一) 最新 iOS 框架整体梳理(二) Part - 3 ...
- 【K8S】Service服务详解,看这一篇就够了!!
k8s用命名空间namespace把资源进行隔离,默认情况下,相同的命名空间里的服务可以相互通讯,反之进行隔离. 1.1 Service Kubernetes中一个应用服务会有一个或多个实例(Pod, ...
- npm设置为淘宝镜像地址
1. npm设置为淘宝镜像 $npm config set registry https://registry.npm.taobao.org 2. 检查一下 $npm config get regis ...
- JavaWeb网上图书商城完整项目--day02-9.提交注册表单功能之servlet层实现
1.当用户在界面提交注册提交的时候,我们在UerServlet来实现具体的业务方法 标准demo: 1CommonUtils CommonUtils类就两个方法: lString uuid():生成长 ...
- SQL注入之Boolean型盲注
什么是Boolean型注入 Boolean型的注入意思就是页面返回的结果是Boolean型的,通过构造SQL判断语句,查看页面的返回结果是否报错,页面返回是否正常等来判断哪些SQL判断条件时成立的,通 ...
- 区间dp 能量项链 洛谷p1063
题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为 (Mars单位),新产生的珠子的头标记为m,尾标记为n. 需要时,Mars人就用吸盘夹住 ...
- msf stagers开发不完全指北(二)
采用 Golang 开发stagers 上一篇文章 msf stagers开发不完全指北(一)中我们谈到如何采用 c 进行 msf 的 stagers 开发,这篇文章我们探讨一下如何使用 Golang ...
- 如何在一个HTML文件中嵌套另一个HTML文件并且可以进行切换HTML文件
使用iframe 要点:a标签+iframe A标签的target属性 iframe 的id与name属性 示例: <!DOCTYPE html> <html> <hea ...