博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM——深入解析之初识
阅读量:4262 次
发布时间:2019-05-26

本文共 1765 字,大约阅读时间需要 5 分钟。

      之前我们已经学习了多线程的相关概念原理以及线程池的管理等,但是要想明白线程的运行过程还需要了解jvm的知识,今天,我们就来介绍一下jvm。

1、什么是JVM

      JVM是Java Virtual Machine(Java虚拟机)的缩写,每个使用Java的开发者都知道Java字节码是在JRE中运行(JRE: Java 运行时环境)。JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作。

      它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。

2、结构

      粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。

这里写图片描述


类装载器

      每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

执行引擎

       主要执行字节码,或者执行本地方法

      主要的执行技术有:解释,即时编译,自适应优化、芯片级直接执行其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式 。
      自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。

运行时数据区

      主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈

这里写图片描述


      方法区和堆由所有线程共享

      堆:存放所有程序在运行时创建的对象
      方法区:当JVM的类装载器加载.class文件,并进行解析,把解析的类型信息放入方法区。
      Java栈和PC寄存器由线程独享。JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址

3、特性

      基于栈(Stack-based)的虚拟机: 不同于Intel x86和ARM等比较流行的计算机处理器都是基于寄存器(register)架构,JVM是基于栈执行的

符号引用(Symbolic reference): 除基本类型外的所有Java类型(类和接口)都是通过符号引用取得关联的,而非显式的基于内存地址的引用。
      垃圾回收机制: 类的实例通过用户代码进行显式创建,但却通过垃圾回收机制自动销毁。
      通过明确清晰基本类型确保平台无关性: 像C/C++等传统编程语言对于int类型数据在同平台上会有不同的字节长度。JVM却通过明确的定义基本类型的字节长度来维持代码的平台兼容性,从而做到平台无关。
      网络字节序(Network byte order): Java class文件的二进制表示使用的是基于网络的字节序(network byte order)。为了在使用小端(little endian)的Intel x86平台和在使用了大端(big endian)的RISC系列平台之间保持平台无关,必须要定义一个固定的字节序。JVM选择了网络传输协议中使用的网络字节序,即基于大端(big endian)的字节序。

总结:

      今天我们知道了什么是jvm,以及jvm的结构等,下一次我们将深入剖析一下jvm的原理和工作流程等。

你可能感兴趣的文章
leetcode之链表类之链表排序-----147/148. 链表快速排序 链表插入排序
查看>>
leetcode之链表类之链表归并类-----OJ 2/21/23/445 链表相加求和 链表归并
查看>>
leetcode之链表逆序翻转类-----92/206 逆序 24/25/61/143 按规则翻转 86/234 双指针分治 19/82/83/203 按规则删除
查看>>
leetcode之深搜递归回溯类-----1/167/653. two sum(记忆化搜索寻找和为给定值的两个数)
查看>>
leetcode之深搜递归回溯类之排列与组合类-----77/39/40/216/317 组合 78/90/368 子排列 22/79/93/131 典型递归回溯 46/47 全排列
查看>>
leetcode之二叉树类之最小公共祖先-----236/235. Lowest Common Ancestor of a Binary/Binary Search Tree
查看>>
leetcode之二叉树类之路径和系列-----112/113/124/257/437 path sum(牵扯附加OJ572和OJ100, 子树和子拓扑)
查看>>
leetcode之二叉树类之二叉树深度系列-----104/111/110/108/109 二叉树最大/最小深度/AVL树的判断和由有序序列生成(牵扯分治相关,OJ105/106)
查看>>
leetcode之二叉树类之二叉树遍历系列-----94/144/145/102/107/103
查看>>
leetcode之二叉树类之二叉树中序遍历运用-----OJ173/230/98/99/285 二叉树迭代器/BST第K小元素/判断BST是否合法/恢复BST/二叉树下个节点
查看>>
leetcode之链表类之相交成环类-----OJ 160/141/142 链表相交 链表环
查看>>
leetcode之数组类之区间类-----OJ 56/57/435/239 重叠区间个数 合并区间 插入区间 滑动窗口最大值
查看>>
leetcode之数组类之数组的旋转与分治类-----OJ 189/33/81/153/154 数组旋转 旋转数组搜索 88 有序数组合并 4 两个有序数组寻找第K个元素/中位数 35 寻找插入位置
查看>>
leetcode之双指针类-----OJ 228/15/16/18/26/80/121/75
查看>>
关于典型的存储引擎及其代表(mysql、redis/memcached、leveldb/rocksdb/hbase系)
查看>>
记 今日头条广告架构社招面试
查看>>
数据结构算法面试总结 序
查看>>
auto关键字实现简易的数值范围迭代器
查看>>
c++11的时间库chrono
查看>>
c++11的闭包(lambda、function、bind)
查看>>