JVM概述

JVM概述

1、一些性能上的问题

  • 我好好运行的线上系统突然间卡死了,系统无法访问,当然这个原因非常多;
  • 想解决线上的JVM GC问题却无从下手;
  • 新的项目上线了,对于各种JVM参数的设置一脸茫然,全部直接默认;

什么是Java虚拟机(JVM)?

​ JVM(Java Virtual Machine),是一种能够执行Java字节码的虚拟机。

​ JVM是Java平台的基石,Java应用服务器实质是JVM的一种扩展,而Java应用程序则运行在JVM之上。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

​ JVM是Java跨平台的核心机制,它主要由类加载器、运行时数据区、执行引擎、本地方法接口等几个部分组成。JVM的主要职责包括加载代码、校验代码、执行代码、输出执行结果等。当Java编译器完成了源代码文件(.java)的编译工作之后,就生成了能被Java虚拟机识别的字节码文件(.class)。JVM在执行这些字节码文件时,需要进行加载、链接、初始化,然后调用相应的方法。

2、Java语言及Java生态图

2.1、OracleJDK与OpenJDK什么关系?

image-20240416180452941

​ OracleJDK可以视为OpenJDK的一个衍生版本。这是因为Oracle公司在2006年收购了Sun Microsystems,从而获得了Java的知识产权和相关技术。随后,Oracle基于OpenJDK进行开发,并在其基础上发布了OracleJDK。

​ OpenJDK是Java语言的一个开源实现,项目肇始于2006年SUN公司在Java One大会上对Java的开源决定和承诺,并于2009年4月正式对公众发布。它遵循GPL协议,是Java社区的核心项目,由全球各地的开发者共同参与开发和维护。

​ 而OracleJDK在OpenJDK的基础上添加了一些商业功能和工具,例如Java Mission Control、Java Flight Recorder和商业支持等。此外,OracleJDK还包含了一些与Oracle相关的特性,比如Oracle Advanced Compression和Oracle Real Application Testing。这使得OracleJDK在功能和工具方面相较于OpenJDK更为丰富。

​ 总的来说呢,OracleJDK和OpenJDK都是Java开发工具包的重要组成部分,它们之间的关系是OracleJDK在OpenJDK的基础上进行了商业化的扩展和优化。这种关系使得开发者可以根据项目需求选择适合的JDK版本。

2.2、JDK和JVM是什么关系?

image-20240416200716657

如何理解Java是一个跨平台的语言?

image-20240416200830010

​ “一次编译到处运行”,当java源代码成功编译成字节码之后,如果想在不同的平台上运行的话就不需要再次编译了,但是,就现在来讲这个并不能说是一个特点了,Python、PHP、Perl、Ruby等有强大的编译器。跨平台已经成为了入门语言的必选特性了。

如何理解JVM是跨语言平台?

image-20240416201426437

​ Java虚拟机根本不关心运行在其内部的程序到底是使用什么编程语言编写的,它只关心“字节码文件”

虽然Java不是最强大的语言,但是JVM是最强大的虚拟机

Java不存在内存溢出?内存泄漏?

image-20240416201831377

​ 想多了,当然不是的。

  • 内存溢出,主要发生在当Java程序试图使用比系统给它更多的内存时就会内存溢出。系统就给它了那些,它还想超出一部分。这可能是因为程序中的某一个部分不断地申请新的内存空间,而没有适当的释放不再需要的内存,当JVM的堆内存达到了最大的限制时,就会抛出OutOfMemoryError的错误,这就是内存溢出;
    • Java中最常见的就是堆内存溢出,Java程序的对象都存储在堆内存中,当堆内存中的对象数超过了JVM所分配的最大堆内存容量时,就会发生堆内存溢出。
    • 除了堆内存溢出有外,还有栈内存溢出,通常时由于方法调用的递归层次太深而导致栈内存耗尽。
  • 内存泄漏,是另一种情况,当应用程序持有不再需要的对象仍然被持有,无法被垃圾回收器释放,导致内存占用持续增加,最终耗尽可用内存。
    • 在Java中,最常见的内存泄漏是由于对象的引用未被释放而导致。比如,当一个对象持有了对另一个对象的引用,而这个引用在程序中不再需要时却未被释放,这就会导致内存泄漏。
    • 内存泄漏可能是由于程序逻辑错误、不良的对象引用管理或者使用第三方库时未正确的释放资源所导致的。

那么怎么解决内存的溢出和泄漏呢?

  • 对于内存的溢出,可以通过增加堆内存大小(这个就得去调JVM的参数了,你再使用默认的就不能满足系统需求了)或者优化程序设计来减少内存的使用。
  • 对于内存的泄漏,需要通过代码审查和分析来找出没有被释放引用的地方,并保证在不再需要对象时及时释放对其的引用。使用Java内置的垃圾回收器也能帮助检测和处理内存泄漏问题。

各种JVM

  • Sun Classic VM -->解释型

  • Exact VM --> Solaris

  • SUN公司的 HotSpot VM

  • BEA 的 JRockit --> 不包含解释器,服务器端,JMC

  • IBM 的 J9

  • KVM和CDC/CLDC Hotspot

  • Azul VM

  • Liquid VM

  • Apache Harmony

  • Microsoft JVM

  • TaobaoJVM

  • Graal VM --> 2018年,“Run Programs Faster Anywhere”

    image-20240417075651624

  • Dalvik VM

  • 其他JVM:

    Java Card VM、Squawk VM、JavaInJava、Maxine VM、Jikes RVM、IKVM.NET、Jam VM、Cacao VM、Sable VM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM

2.3、JVM的生命周期

​ Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的退出有以下几种情况:

  • 某线程调用Runtime类或者System类的exit方法,或Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt的操作;
  • 程序正常的执行结束;
  • 程序在执行过程中遇到了异常或错误而异常终止;
  • 由于操作系统出现错误而导致Java虚拟机进程终止;

2.4、重点说一下HotSpot

  • SUN的JDK版本从1.3.1开始运用HotSpot虚拟机, 2006年底开源,主要使用C++实现,JNI接口部分用C实现。
  • HotSpot是较新的Java虚拟机,使用JIT(Just in Time)编译器,可以大大提高Java运行的性能。
  • Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而HotSpot将常用的部分代码编译为本地(原生,native)代码,这样显着提高了性能。
  • HotSpot JVM 参数可以分为规则参数(standard options)和非规则参数(non-standard options)。 规则参数相对稳定,在JDK未来的版本里不会有太大的改动。 非规则参数则有因升级JDK而改动的可能。

2.5、JVM架构图

image-20240417081143902

这个架构可以分成三层看:

  • 最上层:javac编译器将编译好的字节码class文件,通过java类装载器执行机制,把对象或class文件存放在jvm划分内存区域。
  • 中间层:称为Runtime Data Area,主要是在Java代码运行时用于存放数据的,从左往右为方法区(永久代、元数据区)、堆(共享,GC回收对象区域)、栈、寄存器、本地方法栈(私有)。
  • 最下层,解释器、JIT(just in time)编译器和GC(Garbage Collection,垃圾回收器);

JVM的几块知识

image-20240417103926853

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561952.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从头开始构建自己的 GPT 大型语言模型

图片来源: Tatev Aslanyan 一、说明 我们将使用 PyTorch 从头开始构建生成式 AI、大型语言模型——包括嵌入、位置编码、多头自注意、残差连接、层归一化,Baby GPT 是一个探索性项目,旨在逐步构建类似 GPT 的语言模型。在这个项目中&#xff…

Unity HDRP Water Surface 水系统 基础教程

Unity HDRP Water Surface 水系统 基础教程 Unity Water SurfaceUnity 项目创建Unity Water Surface:Ocean(海洋)简介Ocean:Transform、GeneralOcean:Simulation(仿真模拟)Ocean:Sim…

pnpm - Failed to resolve loader: cache-loader. You may need to install it.

起因 工作原因需要研究 vue-grid-layout 的源码,于是下载到本地。因为我习惯使用 pnpm,所以直接用 pnpm i 安装依赖,npm run serve 启动失败。折腾了一番没成功。 看到源码里有 yarn.lock,于是重新用 yarn install 安装依赖&…

多模态大语言模型综述

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总…

车控操作系统

车控操作系统 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看…

贪吃蛇游戏实现(VS编译环境)

贪吃蛇游戏 🥕个人主页:开敲🍉 🔥所属专栏:C语言🍓 🌼文章目录🌼 0. 前言 1. 游戏背景 2. 实现后游戏画面展示 3. 技术要求 4. Win32 API介绍 4.1 Win32 API 4.2 控制台程序 4.…

使用脚本启动和关闭微服务

使用脚本启动和关闭微服务 一、前言二、启动1、处理每个服务2、编写启动脚本3、其他启动脚本(无效,有兴趣可以看看)4、启动 三、关闭1、测试拿服务进程id的命令是否正确2、编写关闭脚本3、关闭 一、前言 假如在服务器中部署微服务不使用 doc…

【C++类和对象】const成员函数及流插入提取

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

地图图源#ESRI ArcGIS XYZ Tiles系列(TMS)

目录 1、前言 2、地图图源网址 2.1、Satellite 卫星图源 2.2、Terrain 地形图源 2.3、Street 路网/标注图源 2.4、Specifity 特色设计图源 3、专业推荐”穿搭“ 4、图源配置下载及使用 图源名称图层类别特别注意谷歌 Google①地形 ②影像 ③矢量及标注 ④特色图源国内大…

Nessus【部署 03】Docker部署漏洞扫描工具Nessus详细过程分享(下载+安装+注册+激活)文末福利

Docker部署漏洞扫描工具Nessus 1.安装2.配置2.1 添加用户2.2 获取Challenge code2.3 获取插件和许可证2.4 注册 3.使用4.进阶 整体流程: 1.安装 # 1.查询镜像 docker search nessus# 2.拉取镜像 docker pull tenableofficial/nessus# 3.启动镜像【挂载目录用于放置…

【Java框架】Spring框架(一)——Spring基本核心(IOC/DI)

目录 Java企业级框架企业级系统EJB概念解析EJB与Spring的恩怨情仇 Spring系统架构1. Data Access/Integration(数据访问/集成)2. Web 模块3. Core Container(Spring 的核心容器)4. AOP、Aspects、Instrumentation 和 M…

冰达ROS机器人快速使用指南

欢迎来到《冰达ROS机器人极简使用指南》 Q:这份教程适合谁? A:适合完全0基础新手,需要快速跑起来机器人的基本功能。也适合技术大佬需要快速的了解冰达ROS机器人的使用方法。 Q:这份教程内容很少,是不是…

迅雷下载不了的资源怎么下载?

我想下载Boost库,但是下载不下来 用迅雷下载是一直卡在0k 后来尝试在centos上用wget进行下载,竟然可以 wget https://boostorg.jfrog.io/artifactory/main/release/1.85.0/source/boost_1_85_0.tar.gz

信息打点--语言框架

指纹识别 后端 CMS:一般php开发居多源码程序,其他语言也存在,但不易识别(利用源码程序名去搜漏洞情况,源码下载进行后期的代码审计) 前端 js框架(爬取更多的js从里面筛选URL或敏感泄露key)等…

docker-compose 安装MongoDB续:创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

C++参考手册使用说明

C参考手册使用说明 文章目录 C参考手册使用说明1 为什么要使用C参考手册2 网站3 C参考手册离线格式4 C参考手册使用说明1.1 离线C参考手册下载1.2 html离线C参考手册1.3 chm离线C参考手册1.4 linux安装包C参考手册(只有英文版本)1.5 qch离线C参考手册 更…

2 逻辑斯蒂回归(分类)

目录 1 理论 逻辑回归假设数据服从伯努利分布(二分类),通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。 逻辑斯蒂回归(Logistic Regression)是一种用于解决分类问题的…

MySQL下载与安装

文章目录 1:MySQL下载与安装2:配置环境变量3:验证是否安装成功 1:MySQL下载与安装 打开MySQL官网,MySQL 下载链接选择合适的版本和操作系统,页面跳转之后选择No thanks, just start my download.等待下载即…

seatable部署之后network error【seatable】

这里写自定义目录标题 问题汇总 问题汇总 seatable服务部署后,组件显示正常运行,创建表单,显示Network error 点击错误信息,查看其跳转至另一个页面

详解JVM类加载

从类被加载到虚拟机内存中开始,到释放内存总共有7个步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Ini…