前言
一、概述
1.基本概念
JVM是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收、堆和一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接交互。
运行过程:Java源文件->编译器->字节码文件->JVM->机器码
2.当前主流的JVM
- HotSpot :sun公司的
- J9 :IBM公司的
- JRockit : BEA公司的
3.JVM主要子系统
- 类加载器子系统(Class Lodaer Subsystem)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
4.64位JVM
由于指针膨胀和各种数据类型对齐补充的原因,运行于64位系统上的JAVA应用需要消耗更多的内存空间,通常要比32位系统额外增加10%~30%的内存消耗。
5.指令集架构
- ARM
- x86
- x64
- Sparc
6.java体系结构图
SPECjvm2008:基准测试套件。它是测试用例涵盖了大部分Java基础应用场景,是架构选型和jvm性能评测不可多得的利器。
第一章 JVM运行时数据区
jvm运行时数据区,即Java内存结构。
jvm被分为三个主要的子系统:
- 1.类加载器子系统
- 2.运行时数据区
- 3.执行引擎
本地方法库:它是执行引擎所需的本地库的集合;
程序计数器(Program Counter Register)
定义:
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器,也可称之为PC寄存器;字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
特性:
- 在任何确定的时刻,一个处理器(对于多核处理器是一个内核)都只会执行一条线程中的指令;
- 每条线程都有一个独立的线程计数器(各条线程之间的计数器互不影响,独立存储);
- Java方法:则这个计数器记录的是正在执行的虚拟机字节码指令的地址
- Native方法:计数器值为空(Undefined)
- 此内存区域是唯一在Java虚拟机规范中没有规定任何OutOfMemoryError的区域;
- PC寄存器是对物理PC寄存器的一种抽象模拟,线程私有,生命周期与线程的生命周期保持一致
程序计数器为什么是线程私有的?