JVM规范与架构

it2023-05-23  75

JVM

一、什么是JVM

JVM (Java virtual machine) 是一个虚构出来的计算机

JVM虚拟出一套硬件架构,如处理器、堆、栈等和对应的指令系统

Java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台。

二、JVM如何实现平台无关

三、JVM架构图

四、JVM规范

Java语言与JVM相对独立只要语言能编译成为符合JVM标准的字节码,就能在JVM上运行JVM规范主要规定class文件格式、JVM指令集、数值内部表达方式等JVM 文件格式为Class数据类型包括基础类型与引用类型运行时数据区: PC寄存器 、Java虚拟机栈、本地方法栈Java堆、方法区、运行时常量池 特殊方法:对象的初始化构造 字节码指令集类库 反射、ClassLoader、安全、多线程、弱引用

五、JVM规范指令集

JVM指令又称为字节码指令

由一个byte的操作码(opcode)跟上0个到多个操作数构成。

除去保留指令 54条,JVM的有效指令一共 202条,可以分为 10个大类

六、JVM启动流程

七、JVM架构运行时数据区构成

1、PC寄存器

每个线程拥有独立的PC寄存器

在线程创建时创建

指向下一条指令的地址

执行本地方法时,PC的值为undefined

2、方法区

保存装载的类信息

类型、常量、静态变量、JIT编译后的代码缓存等

Hotpot中,在java7之前方法区也叫永久代 Perm

Java6 类型的常量池还在方法区,Java7之后转移到堆中

3、Java堆

和程序开发密切相关

“几乎”所有的对象实例都在堆中

所有线程共享Java堆

在HotSpot中,堆是分代的

是GC的主要工作区间

新生代 Young Generation:又分为 Eden 、Survior(From 、To)

老年代 Old Generation

在Java9之后的默认GC G1中,仍然沿用了年轻代和老年代

4、Java栈

线程私有

栈由一系列帧组成

帧保存一个方法的局部变量、操作数栈、动态链接、返回地址

每一次方法调用创建一个帧,并压栈

八、JVM基本机构 堆、栈、方法区交互

九、JVM基本结构 解释运行与编译运行

解释运行: 解释执行以解释方式运行字节码解释执行的意思是:读一句执行一句 编译运行(JIT) 将字节码编译成机器码直接执行机器码运行时编译编译后性能有数量级的提升

十、JVM常用参数

Trace跟踪参数 堆的分配参数 栈的分配参数

1、Trace跟踪参数

-XX:+PrintGC java9之后 -Xlog:gc 可以打印GC的简要信息

-XX:+PrintGCDetails java9之后 -Xlog:gc 打印GC详细信息

PSYoungGen total 2560K, used 102K [0x00000007bf980000, 0x00000007bfc80000, 0x00000007c0000000)

eden space 2048K, 5% used [0x00000007bf980000,0x00000007bf9999d8,0x00000007bfb80000)

from space 512K, 0% used [0x00000007bfc00000,0x00000007bfc00000,0x00000007bfc80000)

to space 512K, 0% used [0x00000007bfb80000,0x00000007bfb80000,0x00000007bfc00000)

ParOldGen total 8704K, used 4502K [0x00000007bec00000, 0x00000007bf480000, 0x00000007bf980000)

object space 8704K, 51% used [0x00000007bec00000,0x00000007bf065880,0x00000007bf480000)

Metaspace used 3102K, capacity 4500K, committed 4864K, reserved 1056768K

class space used 338K, capacity 388K, committed 512K, reserved 1048576K

-XX:+TraceClassLoading (java9 -Xlog:class+load=info ) 监控类的加载

2、堆分配参数

-Xmx –Xms 指定最大堆和最小堆

-Xmn 设置新生代大小

-XX:NewRatio 新生代(eden+2*survivor)和老年代的比值

​ 4: 表示 新生代:老年代=1:4

-XX:SurvivorRatio 设置Survivor区和Eden区的比例

​ 8:表示 Eden:Survivor= 8:1,由于有两个survivor区,即Eden占到新生代的80%,

​ 一个Survivor占年轻代的1/10

-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件

8:表示 ** Eden:Survivor**= 8:1,由于有两个survivor区,即Eden占到新生代的80%,

​ 一个Survivor占年轻代的1/10

-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件

-XX:+HeapDumpPath 导出OOM的路径

最新回复(0)