当前位置: 首页 > article >正文

JVM基础概念

一、JVM概述

1. 为什么要学习JVM?

线上系统突然宕机,系统⽆法访问,甚⾄直接 OOM ;

线上系统响应速度太慢,优化系统性能过程中发现 CPU 占⽤过⾼,原因是因为 JVM 的 GC 次 数过于频繁;

新项⽬上线,需要对JVM的各种参数进行设置;

面对上述实际⼯作中产⽣的问题,都需要对 JVM 有全面的掌握和了解。

1.1. Java 跨平台

        Java 是⼀种可以跨平台的编程语⾔,我们通常把 CPU 处理器与操作系统构成的计算机系统整 体成为叫平台。

        不同的 CPU ,差异主要在底层指令集不同,指令集分为精简指令集( RISC )和复杂指令集 ( CISC )。每个 CPU 都有自己的特定指令集。

Java 可以跨平台的最主要原因是因为 JVM ,因为不同的平台,使⽤的 JVM 不⼀样。

        通常,我们编写的 Java 源代码在编译后会⽣成⼀个 Class ⽂件,称为字节码⽂ 件。 Java 虚拟机负责将字节码⽂件翻译成特定平台下的机器代码,然后运⾏。简单来 讲, Java 的跨平台就是因为不同版本的 JVM 。只要在不同的平台上安装相应的JVM,就可以运 ⾏字节码⽂件( .class )并运⾏我们编写的 Java 程序。

1.2 Java虚拟机

  • 虚拟机(Virtual Machine),虚拟计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
  • VMware属于系统虚拟机,完全对物理计算机的仿真,提供一个可运行完整操作系统的平台。程序虚拟机的典型代表是java虚拟机,专门为执行某个计算机程序而设计。在java虚拟机中执行的指令称为java字节码指令。
  • Java虚拟机是一种执行java字节码文件的虚拟机,它拥有独立的运行机制。
  • Java技术的核心就是Java虚拟机,因为所有的java程序都要在java虚拟机内部运行。
  • JVM ( Java Virtual Machine )是 Java 平台的基础,它有⾃⼰的指令集,并在运⾏ 时操作不同的内存区域( JVM 内存模型)。 JVM 虚拟机运⾏于操作系统之上,将字节码加载到 J VM 内存模型中,通过解释器将字节码翻译成当前平台 CPU 能识别的机器码⾏。每⼀条 Java 指 令, Java 虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪⾥。
  • JVM 是运⾏在操作系统之上的,所以,它与硬件没有直接交互。

1.3 JVM的特点

  1. 一次编译到处运行;
  2. 自动内存管理;
  3. 自动垃圾回收功能;

1.4 JVM整体组成部分

  1. 类加载器(ClassLoader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
  4. 本地库接口(Native Interface)

 

        程序在执行之前先要把 java 代码转换成字节码(class 文件),jvm 首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 jvm 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口(NativeInterface) 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。
       而我们通常所说的 JVM 组成指的是 运行时数据区(Runtime Data  Area) ,因为通常需要程序员调试分析的区域就是“运行时数据区”,或者更具体的来说就是“运行时数据区”里面的 Heap(堆)模块。

 1.5Java代码执行流程

 JAVA 程序的执行过程简单来说包括:

1. JAVA 源代码编译成字节码;

2. 字节码校验并把 JAVA 程序通过类加载器加载到 JVM 内存中;

3. 在加载到内存后针对每个类创建 Class 对象;

4. 字节码指令和数据初始化到内存中;

5. 找到 main 方法,并创建栈帧;

6. 初始化程序计数器内部的值为 main ⽅法的内存地址;

7. 程序计数器不断递增,逐条执⾏JAVA字节码指令,把指令执⾏过程的数据存放到操作数栈中 (入栈),执行完成后从操作数栈取出后放到局部变量表中,遇到创建对象,则在堆内存中分配 ⼀段连续的空间存储对象,栈内存中的局部变量表存放指向堆内存的引⽤;遇到⽅法调⽤则再创 建⼀个栈帧,压到当前栈帧的上⾯。


http://www.kler.cn/a/305781.html

相关文章:

  • 算法训练(leetcode)二刷第二十三天 | 455. 分发饼干、*376. 摆动序列、53. 最大子数组和
  • 【GPTs】MJ Prompt Creator:轻松生成创意Midjourney提示词
  • 微信小程序_模板与配置_day2
  • Qt_day7_文件IO
  • 【Go】-gRPC入门
  • MySQL数据库:本地部署数据库以及安装彩虹猫【Navicat】
  • 深度学习基础--卷积网络
  • Vue安装及环境配置【图解版】
  • leetcode 2576.求出最多标记下标
  • C# 开发教程-中级教程
  • IEEE 754浮点数表示
  • 18062 二维数组每行中的最大值
  • k8s环境配置
  • 【Unity】简易而又实用的抽卡算法
  • 机器学习特征构建与特征筛选
  • NC字典树的实现
  • 深入理解 Redis 的文件事件处理器
  • 暗界正方形之谜
  • 【YashanDB知识库】单机升级典型问题及应急措施
  • Spring3-IoC1-IoC容器、基于xml管理bean
  • 【SSRF漏洞】——http协议常见绕过
  • 【React】React18.2.0核心源码解读
  • 乌俄冲突下AI和计算机的使用
  • Spring Boot:现代化Java应用开发的艺术
  • 远程访问电脑共享文件
  • 【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity)