JVM规范与架构

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

猜你喜欢

转载自blog.csdn.net/weixin_44129618/article/details/109182831