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的路径