最近,在学习java虚拟机的内容中,在此总结和记录下学到的。

一、JVM在计算机中的位置

在我们初学java时,便知道java源文件文件会先通过Java编译器编译成字节码文件,这个过程是java编译过程。而我们的java虚拟机执行的就是字节码文件。这个字节码文件可以来自许多地方,例如kotlin,scala等。但只要它能符合java虚拟机的规范,他就可以执行该字节码文件。下面,我们先来看下jvm在我们计算机中的位置。

首先,在我们计算机硬件上的第一层软件就是操作系统了,而jvm是基于操作系统之上的,他并没有与硬件有直接的交互。

其次,用户可通过Java编译器编译生成字节码文件,让字节码文件在jvm上执行。

二、jvm体系结构概览

jvm的体系结构如下图

类加载子系统

类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识;

运行时数据区

Java虚拟机在运行程序的过程中会把它所管理的内存划分为若干个不同的数据区,即分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
若可以按照是否线程共享则分为两块,线程共享的是方法区(Method Area)和堆(Heap),线程独享的是虚拟机栈(VM Stack)(java栈),本地方法栈(Native Method Stack)和PC寄存器(Program Counter Register)。

执行引擎
执行引擎是jvm最核心的部分,jvm是java虚拟机,有自己实现的指令集和执行引擎结构体系,能够支持那些不被硬件直接支持的指令集。负责执行class文件中包含的字节码指令,相当于实际机器上的CPU。

本地方法接口

提供一个标准的方式让java程序通过虚拟机与原生代码进行交互,这也就是我们平常常说的java本地接口。用于调用C或C++实现的本地方法的代码返回结果。

三、jvm采用的指令集架构

栈的指令集架构和寄存器的指令集架构

由于java跨平台的设计,java的指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。

两个指令集架构的区别:

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

寄存器:指令少

四、JVM的生命周期

1.启动

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

2.执行

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

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

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

3.退出

程序正常执行结束

程序异常或错误而异常终止

操作系统错误导致终止

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

除此之外,JNI规范描述了用JNI Invocation API来加载或卸载Java虚拟机时,Java虚拟机的退出情况

jvm入门及理解(一)——简介与体系架构的更多相关文章

  1. jvm入门及理解(五)——运行时数据区(虚拟机栈)和本地方法接口

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

  2. jvm入门及理解(二)——类加载器子系统

    一.类加载子系统的作用 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识: ClassLoader只负责class文件的加载,至于它是否可以运行,则由E ...

  3. jvm入门及理解(三)——运行时数据区(程序计数器+本地方法栈)

    一.内存与线程 内存: 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的 ...

  4. jvm入门及理解(四)——运行时数据区(堆+方法区)

    一.堆 定义: Heap,通过new关键字创建的对象,都存放在堆内存中. 特点 线程共享,堆中的对象都存在线程安全的问题 垃圾回收,垃圾回收机制重点区域. jvm内存的划分: JVM内存划分为堆内存和 ...

  5. jvm入门及理解(六)——垃圾回收与算法

    一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1: ...

  6. JVM入门——运行时数据区

    这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...

  7. Oracle学习笔记—oracle体系架构及状态(nomount、mount和open)简介

    oracle体系架构简介 先来简要了解一下Oracle数据库体系架构以便于后面深入理解,Oracle Server主要由实例(instance)和数据库(database)组成.实例(instance ...

  8. Hadoop体系架构简介

    今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底层实现,MapReduce ...

  9. TensorFlow从入门到理解

    一.<莫烦Python>学习笔记: TensorFlow从入门到理解(一):搭建开发环境[基于Ubuntu18.04] TensorFlow从入门到理解(二):你的第一个神经网络 Tens ...

随机推荐

  1. kafka启动报错"A broker is already registered on the path /brokers/ids/1"解决方案

    问题 kafka挂掉后,启动报错日志如下 [2020-03-19 17:50:58,123] FATAL Fatal error during KafkaServerStartable startup ...

  2. Natas34 Writeup(闯关结束!)

    Natas34: 登录什么都不用做,闯关结束!撒花~~~

  3. Python专题——详解enumerate和zip

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第7篇文章,我们继续介绍迭代相关. enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当 ...

  4. 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...

  5. MySQL:REPLACE函数的使用

    原文链接 REPLACE函数功能 REPLACE(columnName, search_str, replace_str) 查找columnName字段中所有search_str,并替换为replac ...

  6. 【简说Python WEB】Web应用部署

    目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...

  7. 浅谈VUE,使用watch方法监听父组件传到子组件的数据。

    props:['updateData'], data(){ return{ form: { _name:'', }, } }, 第一步接收数据: props:['updateData']   第二步动 ...

  8. Building Applications with Force.com and VisualForce (DEV401) (三):Application Essential:Building Your Data Model

    Dev 401-003:Application Essential:Building Your Data Model Object Relationships1.Link two objects- P ...

  9. Android适配器

    Android适配器 安卓的适配器在我看来是一个非常重要的知识点,面对形式相同但数据源较多的情况时,适配器是一个比较好的解决方法.数据适配器是建立了数据源与控件之间的适配关系,将数据源转换为控件能够显 ...

  10. C++ STL 常用容器之 stack

    C++ STL Container--Stack 栈是一种先进后出(LIFO)的数据结构,限制只能在一端完成插入和删除操作,这一端叫做栈顶(top),另一端即为栈底(bottom).C++ STL(S ...