JVM之JVM的基本介绍

news/2024/10/18 22:31:38/

基本介绍

JVM:全称 Java Virtual Machine,即 Java 虚拟机,一种规范,本身是一个虚拟计算机,直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作

特点:

  • Java 虚拟机基于二进制字节码执行,由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆、一个方法区等组成

  • JVM 屏蔽了与操作系统平台相关的信息,从而能够让 Java 程序只需要生成能够在 JVM 上运行的字节码文件,通过该机制实现的跨平台性

Java 代码执行流程:Java 程序 --(编译)--> 字节码文件 --(解释执行)--> 操作系统(Win,Linux)

JVM 结构:

JVM、JRE、JDK 对比:

  • JDK(Java SE Development Kit):Java 标准开发包,提供了编译、运行 Java 程序所需的各种工具和资源

  • JRE( Java Runtime Environment):Java 运行环境,用于解释执行 Java 的字节码文件

架构模型

Java 编译器输入的指令流是一种基于栈的指令集架构。因为跨平台的设计,Java 的指令都是根据栈来设计的,不同平台 CPU 架构不同,所以不能设计为基于寄存器架构

  • 基于栈式架构的特点:

    • 设计和实现简单,适用于资源受限的系统

    • 使用零地址指令方式分配,执行过程依赖操作栈,指令集更小,编译器容易实现

      • 零地址指令:机器指令的一种,是指令系统中的一种不设地址字段的指令,只有操作码而没有地址码。这种指令有两种情况:一是无需操作数,另一种是操作数为默认的(隐含的),默认为操作数在寄存器(ACC)中,指令可直接访问寄存器

      • 一地址指令:一个操作码对应一个地址码,通过地址码寻找操作数

    • 不需要硬件的支持,可移植性更好,更好实现跨平台

  • 基于寄存器架构的特点:

    • 需要硬件的支持,可移植性差

    • 性能更好,执行更高效,寄存器比内存快

    • 以一地址指令、二地址指令、三地址指令为主


生命周期

JVM 的生命周期分为三个阶段,分别为:启动、运行、死亡

  • 启动:当启动一个 Java 程序时,通过引导类加载器(bootstrap class loader)创建一个初始类(initial class),对于拥有 main 函数的类就是 JVM 实例运行的起点

  • 运行

    • main() 方法是一个程序的初始起点,任何线程均可由在此处启动

    • 在 JVM 内部有两种线程类型,分别为:用户线程和守护线程,JVM 使用的是守护线程,main() 和其他线程使用的是用户线程,守护线程会随着用户线程的结束而结束

    • 执行一个 Java 程序时,真真正正在执行的是一个 Java 虚拟机的进程

    • JVM 有两种运行模式 Server 与 Client,两种模式的区别在于:Client 模式启动速度较快,Server 模式启动较慢;但是启动进入稳定期长期运行之后 Server 模式的程序运行速度比 Client 要快很多

      Server 模式启动的 JVM 采用的是重量级的虚拟机,对程序采用了更多的优化;Client 模式启动的 JVM 采用的是轻量级的虚拟机

  • 死亡

    • 当程序中的用户线程都中止,JVM 才会退出

    • 程序正常执行结束、程序异常或错误而异常终止、操作系统错误导致终止

    • 线程调用 Runtime 类 halt 方法或 System 类 exit 方法,并且 Java 安全管理器允许这次 exit 或 halt 操作

内存结构

内存概述

内存结构是 JVM 中非常重要的一部分,是非常重要的系统资源,是硬盘和 CPU 的桥梁,承载着操作系统和应用程序的实时运行,又叫运行时数据区

JVM 内存结构规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行

  • Java1.8 以前的内存结构图:

  • Java1.8 之后的内存结果图:

线程运行诊断:

  • 定位:jps 定位进程 ID

  • jstack 进程 ID:用于打印出给定的 Java 进程 ID 或 core file 或远程调试服务的 Java 堆栈信息

  • 案例一的几个步骤:

    1.使用top 定位到占用CPU高的进程PID

    2.查看Java进程里面的线程的占用情况 top -H -p +线程号

    说明:-H 指显示线程,-p 是指定进程

    3.通过jstack命令获取占用资源异常的线程栈,可暂时保存到一个文件中查看

  • 案例2可能是出现了死锁

如果想要可视化的话,可以使用jconsole,virtalVM

常见 OOM 错误:

  • java.lang.StackOverflowError 栈溢出错误

  • java.lang.OutOfMemoryError:java heap space 堆溢出错误

  • java.lang.OutOfMemoryError:GC overhead limit exceeded

  • java.lang.OutOfMemoryError:Direct buffer memory

  • java.lang.OutOfMemoryError:unable to create new native thread

  • java.lang.OutOfMemoryError:Metaspace


http://www.ppmy.cn/news/1426797.html

相关文章

设计模式学习笔记 - 开源实战三(中):剖析Google Guava中用到的设计模式

概述 上篇文章,我通过 Google Guava 这样一个优秀的开源类库,讲解了如何在业务开发中,发现跟业务无关、可以复用的通用功能模块,并将它们抽离出来,设计成独立的类库、框架或功能组件。 本章再来学习下,Go…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页,包括以下内容: 头部信息:指定了网页的基本设置和元数据,例如字符编码、视口大小等。CSS文件:引入了多个CSS文件,用于设置网页…

Vue3不用任何构建的原始HTML

Vue3不用任何构建的原始HTML 导入vue.global.js&#xff0c;完成Hello vue!的显示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

原型对象、实例、原型链的联系

const F function () { this.name Jack } // ƒ () { this.name Jack }const e new F() // F { name: "Jack" }console.log(e.name) // Jack 构造函数&#xff1a;现在 F 就是构造函数。任何一个函数被 new 使用后&#xff0c;就是构造函数&#xff0c;没被…

【大语言模型】基础:余弦相似度(Cosine similarity)

余弦相似度是一种用来确定两个向量之间相似性的度量。它在数据科学、信息检索和自然语言处理&#xff08;NLP&#xff09;等多个领域被广泛使用&#xff0c;用于度量在多维空间中两个向量之间角度的余弦。这个指标捕捉的是方向上的相似性而非大小&#xff0c;使其非常适合比较长…

文心一言api开发者文档,python版ERNIE-3.5-8K-Preview模型调用方法

ERNIE 3.5是百度自研的旗舰级大规模⼤语⾔模型&#xff0c;覆盖海量中英文语料&#xff0c;具有强大的通用能力&#xff0c;可满足绝大部分对话问答、创作生成、插件应用场景要求&#xff1b;支持自动对接百度搜索插件&#xff0c;保障问答信息时效。本文介绍了ERNIE-3.5-8K-Pr…

【AcWing】蓝桥杯集训每日一题Day28|组合计数|二项式定理|杨辉三角|211.计算系数(C++)

211.计算系数 211. 计算系数 - AcWing题库难度&#xff1a;简单时/空限制&#xff1a;1s / 64MB总通过数&#xff1a;3703总尝试数&#xff1a;7790来源&#xff1a;《算法竞赛进阶指南》NOIP2011提高组算法标签二项式定理组合计数 题目内容 给定一个多项式 ( a x b y ) k …

GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis

GRAF: Generative Radiance Fieldsfor 3D-Aware Image Synthesis&#xff08;基于产生辐射场的三维图像合成&#xff09; 思维导图&#xff1a;https://blog.csdn.net/weixin_53765004/article/details/137944206?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3…