Java体系和一些基本概念

Java平台的结构图:

JVM与JRE、JDK关系?

JVM:Java Virtual Machine(Java虚拟机),负责执行符合规范的Class文件

JRE: Java Runtime Environment (java运行环境),包含JVM和类库

JDK: Java  Development Kit(java开发工具包),包含JRE和开发工具包,例如javac、javah

JVM所处的位置:

我们通常工作中所接触的基本是Java库和应用以及Java核心类库,知晓如何使用就可以了,但是归根结底代码都是要编译成class文件由Java虚拟机

执行的,所产生的结果或者现象都可以通过Java虚拟机的运行机制来解释。一些相同的代码会由于虚拟机的实现不同而产生不同结果。

Class文件格式

编译后被Java虚拟机所执行的代码使用了一种平台中立(不依赖于特定硬件及操作系统的)的二进制格式来表示,并且经常(但并非绝对)以文件的形

式存储,因此这种格式被称为Class文件格式。Class文件格式中精确地定义了类与接口的表示形式,包括在平台相关的目标文件格式中一些细节上的惯例,

例如字节序(Byte Ordering)等。

正如概念所说,Java为了能够实现平台无关性,制定了一套自己的二进制格式,并经常以文件的方式存储,称为Class文件。这样在不同平台上,只要

都安装了Java虚拟机,那么都可以运行相同的Class文件。

数据类型

与Java程序语言中的数据类型相似,Java虚拟机可以操作的数据类型可分为两类:原始类型(Primitive Types,也经常翻译为原生类型或者基本类

型)和引用类型(Reference Types)。与之对应,也存在有原始值(Primitive Values)和引用值(Reference Values)两种类型的数值可用于变量

赋值、参数传递、方法返回和运算操作。

基本类型和引用类型的具体情况见下图:

Java虚拟机希望更多的类型检查放在编译期就完成,在运行期不需要进行这些操作。其中基本类型达到了这样的要求,在运行期间不需要对其进行类型

检查,也不用和引用类型区分开。这是通过虚拟机的字节码指令完成的,不同类型的字节码指令中都包含了相应的数据类型。

整形类型和整型值的取值范围如下:

对于byte类型,取值范围是从-128至127(-27至27-1),包括-128和127。

对于short类型,取值范围是从−32768至32767(-215至215-1),包括−32768和32767。

对于int类型,取值范围是从−2147483648至2147483647(-231至231-1),包括−2147483648和2147483647。

对于long类型,取值范围是从−9223372036854775808至9223372036854775807(-263至263-1),包括−9223372036854775808和

9223372036854775807。

对于char类型,取值范围是从0至65535,包括0和65535。

浮点类型、取值集合和浮点值:

浮点类型包含32位单精度的float类型和64位双精度的double类型两种,浮点数除了包括正负带符号可数的数值,还包括了正负零、正负无穷大和一

个特殊的“非数字”标识(Not-a-Number,下文用NaN表示)。NaN值用于表示某些无效的运算操作,例如除数为零等情况。所有Java虚拟机的实现都必

须支持两种标准的浮点数值集合:单精度浮点数集合和双精度浮点数集合。

returnAddress类型和值:

returnAddress类型会被Java虚拟机的jsr、ret和jsr_w指令所使用。returnAddress类型的值指向一条虚拟机指令的操作码。与前面介绍的那些数

值类的原始类型不同,returnAddress类型在Java语言之中并不存在相应的类型,也无法在程序运行期间更改returnAddress类型的值。

boolean类型:

Java虚拟机不提供操作boolean类型的字节码指令,程序在编译后boolean类型都转化成了int操作。但是Java虚拟机支持boolean类型的数组的访

问和修改,共用byte类型数组的字节码指令。

运行时数据区

Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程

一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。

Java虚拟机的逻辑构成:

可以看出Java虚拟机的运行时数据区包括了:方法区、Java堆、Java虚拟机栈、PC寄存器、本地方法栈。

PC寄存器:

每个Java虚拟机线程都有自己的PC寄存器。在某个线程被新建时,会获得一个PC寄存器。线程当前执行的方法称为当前方法,PC寄存器用来存

放当前方法中当前执行的字节码指令的地址,如果当前方法是本地方法(Native),那么寄存器存放undefined。寄存器的大小至少应该能够存放一个

returnAddress类型的数据或者与平台相关的本地指针的值。

Java虚拟机栈:

每个Java虚拟机线程都有自己的Java虚拟机栈。Java虚拟机栈用来存放栈帧,而栈帧主要包括了:局部变量表、操作数栈、动态链接。

Java虚拟机使用局部变量表来完成方法调用时的参数传递。局部变量表的长度在编译期已经决定了并存储于类和接口的二进制表示中,一个局部变量可

以保存一个类型为boolean、byte、char、short、float、reference 和 returnAddress的数据,两个局部变量可以保存一个类型为long和double的

数据。

Java虚拟机提供一些字节码指令来从局部变量表或者对象实例的字段中复制常量或变量值到操作数栈中,也提供了一些指令用于从操作数栈取走数据、

操作数据和把操作结果重新入栈。在方法调用的时候,操作数栈也用来准备调用方法的参数以及接收方法返回结果。

每个栈帧中都包含一个指向运行时常量区的引用支持当前方法的动态链接。在Class文件中,方法调用和访问成员变量都是通过符号引用来表示的,动

态链接的作用就是将符号引用转化为实际方法的直接引用或者访问变量的运行是内存位置的正确偏移量。

总的来说,Java虚拟机栈是用来存放局部变量和过程结果的地方。

Java虚拟机栈可能发生如下异常情况:

如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量时,Java虚拟机将会抛出一个StackOverflowError异常。

如果Java虚拟机栈可以动态扩展,并且扩展的动作已经尝试过,但是目前无法申请到足够的内存去完成扩展,或者在建立新的线程时没有足够的内存去

创建对应的虚拟机栈,那Java虚拟机将会抛出一个OutOfMemoryError异常。

Java堆:

Java堆在虚拟机启动的时候被创建,Java堆主要用来为类实例对象和数组分配内存。Java虚拟机规范并没有规定对象在堆中的形式。

Java堆可能发生如下异常情况:

如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常。

方法区:

方法区在虚拟机启动的时候被创建,它存储了每一个类的结构信息,例如运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容、还包括

一些在类、实例、接口初始化时用到的特殊方法。

方法区可能发生如下异常情况:

如果方法区的内存空间不能满足内存分配请求,那Java虚拟机将抛出一个OutOfMemoryError异常.

运行时常量池:

运行时常量池(Runtime Constant Pool)是每一个类或接口的常量池的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量

到必须运行期解析后才能获得的方法或字段引用。运行时常量池在方法区中。

在创建类和接口的运行时常量池时,可能会发生如下异常情况:

当创建类或接口的时候,如果构造运行时常量池所需要的内存空间超过了方法区所能提供的最大值,那Java虚拟机将会抛出一个OutOfMemoryError

异常。

本地方法栈:

本地方法栈用于支持native方法的运行。

java 虚拟机规范_Java虚拟机规范----Java虚拟机结构相关推荐

  1. java高级规范_Java高级规范之二

    二十一.提交java代码前应该检查是否有没用的语句,如:System.out.println(); jsp页面上面是否有alert调试信息 不规范示例:暂无 规范实例:暂无 解析:因为如果保留了有可能 ...

  2. java的书写规范_java书写规范以及技巧

    一. Java命名的一般性指导 1. 类名首字母应该大写.属性(成员变量).方法.对象变量以及所有标识符(如形式参 数.实际参数.局部变量)的首字母应小写,其中包含的所有单词都应紧靠在一起,而 且大写 ...

  3. java的书写规范_JAVA书写规范

    命名规范 1.一般概念 1.尽量使用完整的英文描述符 2.采用适用于相关领域的术语 3.采用大小写混合使名字可读 4.尽量少用缩写,但如果用了,必须符合整个工程中的统一定义 5.避免使用长的名字(小于 ...

  4. 描述java源程序构成_Java第二章Java程序设计

    <Java第二章Java程序设计>由会员分享,可在线阅读,更多相关<Java第二章Java程序设计(140页珍藏版)>请在人人文库网上搜索. 1.第2章 Java基本语法,2. ...

  5. java se与java 的区别_java se与java的区别是什么

    Java是一门程序设计语言,它有三个版本,Java SE(标准版).Java EE(企业版)和Java ME(微型版).而Java SE只是一个使用Java进行编程的规范.框架,它不是一门编程语言.J ...

  6. java基本数据类型_Java面试题Java中有几种基本数据类型?它们分别占多大字节?...

    点击上方"千锋Java学院",选择"置顶公众号" 每天一道面试模拟真题及解析 课前导读 ●回复"每日一练"获取以前的题目,持续更新! ●我希 ...

  7. java http客户端_java 11 标准Java异步HTTP客户端

    这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到 ...

  8. java import路径_Java import以及Java类的搜索路径

    如果你希望使用Java包中的类,就必须先使用import语句导入. import语句与C语言中的 #include 有些类似,语法为: import package1[.package2-].clas ...

  9. java socket程序_java 简单的java socket程序

    //服务器端:ServerDemo.java import java.io.DataInputStream; import java.io.DataOutputStream; import java. ...

  10. java 日期 解析_Java日期解析(Java DATE Parsing)

    Java日期解析(Java DATE Parsing) 我有一个java.util.Date的愚蠢问题. 我有这一行代码,但我不明白为什么这个日期是用这种格式无法解析的. public class T ...

最新文章

  1. 字节一实习生求助:晚上九点半在公司打游戏,被领导发现后开除,将来找工作会背调出来吗?...
  2. c语言adc采集取平均值,读取ADC值的浮动平均值
  3. 前端学习(584):在dom中调试节点
  4. 列表操作 - C#开发人员
  5. 【华为云技术分享】【技术总结】从Hash索引到LSM树
  6. wkhtmltopdf中文显示空白或者乱码方框
  7. Python实现字符串对齐
  8. hdfs 数据迁移_对象存储BOS发布全新工具,加速自建HDFS到云端的访问速度
  9. Q82:三角形网格[Triangle Mesh]图形的平滑着色[Smooth Shading]
  10. 如何使用Movavi Photo Editor 6 for Mac更改图像的背景
  11. stm32与绝对式编码器的ssi接口进行通信
  12. Rufus创建Windows Server UEFI启动盘
  13. cad.net 筛选、选择集
  14. 转自Alon's Blog
  15. SVN各个状态:A C D M G U R I具体含义
  16. crontab每分钟执行一次任务
  17. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇
  18. R语言-因子的构造-factor函数
  19. 举例说明专用计算机和通用计算机的区别,计算机原理答案
  20. 常见的HTTP状态码(HTTP Status Code)说明

热门文章

  1. 三线表是什么?R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、编写自定义三线表结构(将因子变量细粒度化重新构建三线图)、编写自定义函数在三线表中添加p值
  2. R语言plotly可视化:plotly可视化互相重叠的归一化直方图并在直方图中添加密度曲线kde、设置不同的直方图使用不同的分箱大小(bin size)、在直方图的边缘添加边缘轴须图
  3. R语言t分布函数Student t distribution(dt, pt, qt rt )实战
  4. python读写二进制文件(读写字节数据)
  5. 决策树ID3、决策树C4.5、决策树CART、CART树的生成、树的剪枝、从ID3到CART、从决策树生成规则、决策树优缺点
  6. Question: Short And Long Read Sequencing
  7. Bowtie下载安装
  8. 解读生命密码的基本手段 ——DNA测序技术的前世今生
  9. evolution ubuntu邮箱_Ubuntu下使用Evolution电子邮箱客户端
  10. STM32-超级终端显示日历