虚拟机系列 | JVM特点,基础结构与执行周期
本文源码:GitHub·点这里 || GitEE·点这里
一、虚拟机简介
1、虚拟机概念
虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。
2、JVM虚拟机
JVM是Java-Virtual-Machine的缩写,即Java虚拟机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
3、JVM特点
首先一次编译处处运行是学习Java语言都知道的事情,其实并不是Java语言跨平台,是JVM跨平台,Jvm运行时并不是执行Java文件,而是执行编译后的.class文件。
字节码
字节码文件即JVM可以识别并执行的二进制文件,不同的编程语言经过编译器编译处理之后,转换成统一的字节码规范文件,这样JVM就可以执行。
跨平台
跨平台的特性即JVM虚拟机可以运行在不同的计算机系统上,例如经常使用的Linux系统,MacOS系统,Win系统,一次编译,处处运行就是这样理解的。
跨语言
随着JVM的不断发展和优化,很多语言都借助JVM的能力,各种编程语言经过编译,转换为字节码文件,JVM都可以识别,这也是现在Java体系下业务编程经常混语言的原因。
注意:现在和后续Jvm系列文章都是基于HotSpot-VM和JDK1.8+版本的基础之上。
二、虚拟机结构
Jvm的整体结构大致如下:
1、类加载器
类加载器用来加载Java类到JVM虚拟机中,源代码程序.java文件在经过编译器编译之后就被转换成字节代码.class文件,类加载器负责读取字节代码,并转换成java.lang.Class类的一个实例。
2、运行时数据区
元数据区
JDK1.8开始的说法,之前称为方法区Method-Area,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
堆区
所有线程共享的一块内存区域,虚拟机启动时被创建用来存放对象实例。
JVM栈
可以参考了解栈的数据结构,存放Java方法执行的内存模型,在Java开发中,一个功能实现需要多个子程序方法配合,程序执行时跳往子程序前,会将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,退回到原来的程序中。
本地方法栈
本地方法栈和虚拟机栈的功能类似,为JVM调用native方法时服务。
程序计数器
相对较小的一块内存空间,作用可以理解是当前线程所执行的字节码的行号指示器。
3、执行引擎
Java虚拟机最核心的组成部分,输入的是字节码,处理过程是字节码解析,输出执行结果。
三、生命周期
这里说的JVM生命周期,指JVM执行Java程序时的周期:
启动初始化:启动时通过引导类加载器创建初始类完成;
程序执行:从main方法开始,执行Java程序,直到程序执行完结束;
虚拟机退出:程序正常执行结束,或者发生异常、错误等而造成终止,也可以调用exit退出方法;
四、HotSpot虚拟机
HotSpot是Java体系下使用最多的虚拟机,它结合了最新的内存模型,垃圾收集器和自适应优化器,为使用许多先进技术的Java应用程序提供了最佳性能。
主要原因:使用多,大部分的Java运行环境都依赖HotSpot虚拟机。
五、源代码地址
GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent
推荐阅读:数据源管理系列
虚拟机系列 | JVM特点,基础结构与执行周期的更多相关文章
- 虚拟机系列 | JVM类加载机制
本文源码:GitHub·点这里 || GitEE·点这里 一.类加载简介 类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封 ...
- 虚拟机系列 | JVM运行时数据区
本文源码:GitHub·点这里 || GitEE·点这里 一.内存与线程 1.内存结构 内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱 ...
- 【java虚拟机系列】java虚拟机系列之JVM总述
我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的 ...
- JVM虚拟机系列(一)类的加载
JAVA虚拟机系列(一) 类的加载 目录 1 类的初始化过程 2 详解初始化时的各个阶段 一.类初始化的过程 先来看一个CLASS文件在整体生命周期里会遇到的阶段: xxxx.class ---> ...
- Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- java虚拟机之JVM生命周期
java生命周期分为以下三部分:启动,运行,消亡. 启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的 ...
- Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- [转帖]Java虚拟机(JVM)体系结构概述及各种性能参数优化总结
Java虚拟机(JVM)体系结构概述及各种性能参数优化总结 2014年09月11日 23:05:27 zhongwen7710 阅读数 1437 标签: JVM调优jvm 更多 个人分类: Java知 ...
随机推荐
- SpringBoot --- 自定义 Starter
SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...
- ElasticSearch实战系列七: Logstash实战使用-图文讲解
前言 在上一篇中我们介绍了Logstash快速入门,本文主要介绍的是ELK日志系统中的Logstash的实战使用.实战使用我打算从以下的几个场景来进行讲解. 时区问题解决方案 在我们使用logstas ...
- unity探索者之socket传输protobuf字节流(二)
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/6977935.html 上一篇主要说的是protobuf字节流的序列化和解析,将pr ...
- JAVA-单例模式的几种实现方式
一.什么是单例模式 单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式之一,其目的是保证整个应用中只存在类的唯一个实例. 比如我们在系统启动时,需要加载一些 ...
- 非对称加密与HTTPS(转)
序:HTTPS更安全,为什么? 因为HTTP协议本身毫无安全性可言. 当你访问一个纯HTTP的网站(以及与这个网站有任何网络交互)时,你发出去一个请求.在这个请求到达网站服务器的路途上,不管是你家的路 ...
- 测量定位实践-:C#采集控制
用Halcon已经完成采集,在在C#中不行. 其实还是比较简单,主要是Halcon封装的太好了. 主要是以下几个算子: *打开 Image Acquisitionopen_framegrabber ( ...
- 复制输入框内容(兼容ios)
const copyInput = document.querySelector('.copy-container'); copyInput.select(); //安卓可识别进行选中 copyInp ...
- shell脚本同步私人git仓库
前言 分别在个人电脑.个人服务器.码云三个地方建立了数据仓库用于保存自己的各种数据,通过git+shell进行数据同步. 此举不仅可以避免因存储损坏.版本更迭.数据误操作等因素带来的各种麻烦,也能实现 ...
- quartz表(11张)
/* Navicat Premium Data Transfer Source Server : 本地连接 Source Server Type : MySQL Source Server Versi ...
- Vue基础(一)---- 模板语法
1.基本理解 Vue其实是一个渐进式JavaScript框架,封装好了一些方法,不再需要操作通过操作DOM,在相同的目标下能够更快的编写代码. 声明式渲染→组件系统→客户端路由→集中式状态管理→项目构 ...