JVM指南

1. JVM概述

1.1 定义

  JVM (Java Virtual Machine 简称 JVM),即 Java 虚拟机,是运行所有 Java 程序的抽象计算机。
  Java 虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码,即.class文件),就可以在多种平台上运行。

1.2 作用

  跨平台:Java 语言之所以有跨平台的优点,完全是 JVM 的功劳,跨平台性是 JVM 存在的最大亮点。例如:无论是Windows、Linux还是Unix操作系统,安装上 JVM 之后,就都可以支持 Java 程序的运行。
  垃圾回收: Java 语言的诞生,极大的降低了软件开发人员的学习难度,除了 Java 面向对象编程的特性能够降低学习难度以外,还有一个比较重要的点,就是在进行 Java 编程的时候,可以更少的去考虑垃圾回收机制。在C 语言编程过程中,要通过代码手动实现内存垃圾的回收与空间释放,这提升了编程的难度,因为考虑内存空间释放,更多的会涉及到底层的知识,这是非常高的一个门槛。而JVM 拥有自己的垃圾回收机制,为开发人员分担了部分工作。
  Tips:JVM 在 Java 语言中占据了非常重要的地位,学习 JVM 是 Java 技术人员必须要做的事情,目前企业对于 Java 从业者对 JVM 的掌握程度要求非常高,是重点学习内容。

1.3 JVM、JRE 、JDK 的联系

  JDK:全称 Java Development Kit ,开发工具包,是 java 的核心。JDK 包含了JRE,一堆工具类(javac、java)以及 Java 的基础类库(Object,string);
  JRE:全称 java runtime environment。包含了JVM 实现和需要的类库。JRE 是一个运行环境,并非开发工具;
  JVM:它是一个虚拟计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
在这里插入图片描述
  总体来说,我们利用 JDK 开发程序,通过 JDK 的 javac 工具包进行编译,将 Java 文件编译为. class 文件(字节码文件),在 JRE 上运行这些文件的时候,JVM将字节码文件翻译给操作系统,映射到 CPU 指令集或者是操作系统调用,最终完成程序的运行。

2. JVM 整体架构

2.1 结构组成

  JVM 结构主要分为以下几个模块:
在这里插入图片描述

  Class 文件:主要指编译成字节码的 Java 文件,Class 文件才是 JVM 可以识别的文件,所以 Java 文件需要先进行编译才可进入 JVM 执行;
  类加载子系统:类的加载,主要负责从文件系统,或者网络中加载 Class 信息,并与运行时数据区进行交互;
  运行时数据区:主要包括五个小模块,Java 堆, Java 栈,本地方法栈,方法区,寄存器。
  执行引擎:分配给运行时数据区的字节码将由执行引擎执行,执行引擎读取字节码并逐个执行。垃圾回收器就是执行引擎的一部分;
  本地方法接口:与本机方法库进行交互,提供执行引擎所需的本机库;
  本地方法库:它是执行引擎所需的本机库的集合。

  下面通过 6 个步骤来简单描述一个 Java 文件在 JVM 中的流转过程:
在这里插入图片描述

  步骤 1 : 我们的 Demo.java 文件,通过 JDK 的 javac 命令被编译为Demo.class 文件;
  步骤 2 :JVM 有自己的类加载器,将编译好的 Demo.class文件进行了加载;
  步骤 3 :类加载器将加载的 Demo.class文件投放到运行时数据区,供程序执行使用;
  步骤 4 :运行时数据区将字节码文件,交给执行引擎执行;
  步骤 5 :执行引擎执行完毕,会对运行时数据区的数据进行操作,比如说垃圾回收;
  步骤 R :图中有很多步骤 R ,指的是随机发生的步骤,只要我们的程序在运行过程中需要调用本地方法,那么步骤R就会发生。

2.2 类加载子系统

  Java 的动态类加载功能由类加载器子系统处理,处理过程包括加载、链接和初始化,如下图所示。
在这里插入图片描述

  加载:通过三种不同的类加载器对 Class 文件进行加载,我们也可以自定义类加载器。
  链接:对加载好的 Class 文件进行字节码、静态变量、方法引用等进行验证和解析,为初始化做准备。
  初始化:类加载的最后阶段,对类进行初始化。

2.3 运行时数据区

  运行时数据区共包含如下 5 个模块:方法区,Java 栈,本地方法栈,堆和程序计数器。
在这里插入图片描述

  方法区(Method Area):所有的类级数据将存储在这里,包括静态变量。每个 JVM 只有一个方法区,它是共享资源;
  堆区(Heap Area):所有对象及其对应的实例变量和数组将存储在这里。每个 JVM 也只有一个堆区域。由于方法和堆区域共享多个线程的内存,所存储的数据不是线程安全的;
  栈区(Stack Area):对于每个线程,将创建单独的运行时栈。对于每个方法调用,将在栈存储器中产生一个条目,称为栈帧。所有局部变量将在栈内存中创建。栈区域是线程安全的,因为它不共享资源;
  PC寄存器(PC Registers):也称作程序计数器。每个线程都有单独的 PC 寄存器,用于保存当前执行指令的地址。一旦执行指令,PC 寄存器将被下一条指令更新;
  本地方法栈(Native Method stacks):保存本地方法信息。对于每个线程,将创建一个单独的本地方法栈。

  Tips:方法区和堆为共享内存区域,多线程环境下共享这两块内存区域。 Java 栈,本地方法栈和程序计数器为线程私有部分,私有数据对其他线程不可见。

2.4 执行引擎

  执行引擎包含三个模块:解释器,JIT 编译器和垃圾回收器。
在这里插入图片描述

  解释器:解释器是作用于字节码的解释。解释器的缺点是当一个方法被调用多次时,每次都需要一个新的解释;
  JIT 编译器:JIT 编译器消除了解释器的缺点。执行引擎将在转换字节码时使用解释器的帮助,但是当它发现重复的代码时,将使用 JIT 编译器,这提高了系统的性能;
  垃圾回收器(Garbage Collector):收集和删除未引用的对象。可以通过调用 System.gc() 触发垃圾收集。

3. JVM常用参数配置

3.1 IntelliJ IDEA添加JVM运行参数

  打开 “Run->Edit Configurations”菜单,然后在VM Options中添加相应的 JVM 参数。
在这里插入图片描述

3.2 JVM常用参数

3.2.1 跟踪垃圾回收

在这里插入图片描述

-XX:+PrintGC 参数
  参数作用:垃圾回收跟踪中的常用参数。使用这个参数启动 Java 虚拟机后,只要遇到 GC,就会打印日志。
  示例

[GC (System.gc())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值