JVM-整体结构原理深度解析

JVM定义

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用 Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

2 Java跨平台与JVM的联系
JVM是一个软件,在不同的平台上,JVM有不同的版本。
Java在编译之后会生成一种.class文件,这种文件称为字节码文件。
JVM虚拟机就是将Java编译后的.class文件翻译成特定平台下的机器码,然后运行。也就是说,在不同平台上装上平台对应的JVM虚拟机后,就可以将Java字节码文件转换,然后运行我们的Java程序。 
值得注意的是,Java编译后的结果是生成字节码,而不是机器码。字节码是不可以直接运行的,必须通过JVM再次翻译成机器码才可以运行。即使是将Java程序打包成可执行文件,也仍然需要JVM的支持才可以运行。  跨平台的是Java程序,而不是JVM
JVM是用C/C++开发的,不能平台,不同的平台下JVM的版本是不同的。
(备注: 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据。

JVM体系结构概述

JVM启动后,对操作系统来说,JVM是一个的进程,这个进程基本结构包括内容如下

类装载器(ClassLoader)

负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 

执行引擎(Execution Engine)

执行引擎负责解释命令,提交操作系统执行。 

本地接口(Native Interface)

Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。 主要是调用c或c++实现的本地接口

本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合 C/C++程序,Java诞生的时候是C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为Native的代码,它的具体做法是Native Method Stack中登记Native方法,在Execution Engine 执行时加载Native libraries。

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用WebService等等,不多做介绍。

运行时数据区(Runtime Data Area)

执行引擎执行过程中产生的数据会存储在一块内存区域。这块内存区域就是运行时数据区。

JVM内存区域

从图中可以看出jvm的内存区域可以按照 线程共享【堆、方法区】和 线程私有【虚拟机栈、本地方法栈、程序计数器】进行划分。
下面示例 -》对应的原理结构图 

 

线程私有

Java虚拟机栈

描述:
  • 线程执行了一个方法,就会对这个方法调用创建对应的一个栈帧
  • 栈帧中存储了 方法的局部变量表操作数栈动态链接、方法出口(方法的返回地址)等信息
    • 局部变量表
      • 用于存储方法参数和方法内部定义的局部变量。
    • 操作数栈
      • 可以理解为PC寄存器:用于作为计算过程的临时数据存储区。
        • 临时数据指的变量对应的具体值 eg:int a=1; 对应的是1这个值
      • CPU执行load命令时能将数据加载到操作数栈。
    • 动态链接:是在程序运行期间完成的将符号引用替换为直接引用
    • 方法返回地址
      • 方法退出之后都需要返回方法被调用的位置。
         
特点:
  • 栈的生命周期(线程生命周期一致)
  • 不存在垃圾回收的问题   
  • 可能的异常信息( java.lang.StackOverflowError)

本地方法栈

跟Java虚拟机栈类似的,也是存放各种native方法的局部变量表之类的信息。

程序计数器

描述:
  • 每个线程都有一个程序计数器
  • 用来记录当前执行的字节码指令的位置的(行到了哪一条字节码指令)
 

线程共享

方法区 -》永久代(Meta Space) | 元数据空间

描述:
  • JVM规范层面的东西
  • jdk1.7 叫做方法区(永久带permGenspace) ;JDK 1.8 +  叫做 方法区( “Metaspace”(元数据空间))
  • 永久带或metaspace是对方法区的不同实现,是实现层面的东西。
功能:
  • 存储被jvm加载的类的结构信息、常量、静态变量、编译器编译后的代码等
    • 类结构信息:类的名称、方法、字段等信息。
   
class文件会被Java虚拟机加载到哪个位置存储-chatgpt

在传统的Java虚拟机中,.class文件在加载时会被存储在永久代(Permanent Generation)中。永久代是Java虚拟机的一部分,用于存储类的元数据信息,包括类的结构、方法、字段等信息。这意味着在传统的Java虚拟机中,加载的类信息(包括字节码)将占用永久代的空间。

然而,从Java 8开始,永久代被移除,取而代之的是元空间(Metaspace)。在元空间中,类的元数据信息将被动态地分配和管理内存,而不再受到永久代的限制。因此,.class文件的内容会被加载到元空间中。

总体而言,具体的存储位置取决于Java虚拟机的实现版本,而在现代的Java虚拟机中,元空间是类元数据信息的存储区域。

Java堆

描述:
Java进程启动时内存分配:  当通过Java命令启动Java进程时,Java虚拟机会分配一块内存,这块内存包括了不同的区域,如堆空间、方法区(在Java 8之前,现在是元空间)、虚拟机栈、本地方法栈等。
      内存的一部分用于创建堆空间,当程序中创建对象的时候,就从堆空间中分配内存。 (扩展:GC 是 JVM 内部的一个进         程,回收无效对象的内存用于将来的分配 )
存储 实例对象(所有的实例对象以及数组都要在堆上进行分配),
Java堆是垃圾收集器管理的主要区域因此很多时候也被称为 “GC堆”
示例:
可以认为局部变量表里的“replicaManager”指向了Java堆内存里的ReplicaManager对象
 

4.3 完整流程

JVM内存参数设置

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar
关于元空间的JVM参数有两个:
  • -XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N 
  • -XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。
  •  -XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M,达到该值就会触发 full gc进行类型卸载, 同时收集器会对该值进行调整:(动态调整)
    •  如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超 过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样,- XX:PermSize代表永久代的初始容量。 
  • 由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生 了大小调整,基于这种情况,
    • 一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大, 对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。

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

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

相关文章

Tensorflow2.0笔记 - 常见激活函数sigmoid,tanh和relu

本笔记主要记录常见的三个激活函数sigmoid,tanh和relu,关于激活函数详细的描述,可以参考这里: 详解激活函数(Sigmoid/Tanh/ReLU/Leaky ReLu等) - 知乎 import tensorflow as tf import numpy as nptf.__ve…

spring boot3token拦截器链的设计与实现

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截…

StarRocks实战——松果出行实时数仓实践

目录 一、背景 二、松果出行实时OLAP的演进 2.1 实时数仓1.0的架构 2.2 实时数仓2.0的架构 2.3 实时数仓3.0的架构 三、StarRocks 的引入 四、StarRocks在松果出行的应用 4.1 在订单业务中的应用 4.2 在车辆方向的应用 4.3 StarRocks “极速统一” 落地 4.4 StarRoc…

设计模式-结构型模式-享元模式

享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。[DP] 解决对象的开销问题,像围棋,一盘棋理论上有361个空位可以放棋子,那如果用常规的面向对象方式编程,每盘棋都可能有两三百个…

记录第一次使用QT

今晚和舍友准备搞一个QT网盘的项目,我之前也没有用过QT。在舍友的指导下,我安装了QT creator,然后完成了第一次的QT的编译运行,记录一下这激动的感觉(2024-03-07)。 使用qmake进行的编译。qDebug进行输出调试hello qt…

FedDefender: Client-Side Attack-Tolerant Federated Learning

与现有的大部分方法不同,FedDefender是在客户端层面的防御机制。 方法叠的有点多 大部分方法都在④这一步防御,通过设计鲁邦的聚合策略等,但是本文通过修改本地训练策略,来更新模型,文章主要基于两个观点: …

机器学习的边界与实际应用

目录 前言1 机器学习的广泛适用性1.1. 利用输入输出映射1.2. 大量的可用数据 2 机器学习能做的事情举例2.1 自动驾驶2.2 用户请求处理2.3 有大量数据的医学影像诊断 3 机器学习不能做的事情举例3.1 市场分析报告3.2 感同身受的邮件回复3.3 手势意图判断3.4 少量数据的医学影像诊…

真Unity-Editor二次开发-ScriptableObject 可自定义UI界面

关于ScriptablObject自定义 作为官方指定的,曾经我也吐槽过ScriptableObject很鸡肋,个人曾经也是强烈反对在项目中使用,但直到我今天看到下面这个代码,菜发现其实只是自己太菜鸡而已 --------------不想多写什么 -------------…

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求,无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测,获取丰富多样的地理空间数…

Java面试篇【JVM】常见面试题(2024最新)

JVM 1. Java内存区域详解 线程私有:程序计数器,虚拟机栈,本地方法栈 线程共享的:堆,方法区,直接内存 1.1 各个区域详解 程序计数器 每个线程需要一个计数器记录自己执行到哪一行了。线程之间切换需要保存…

LVS集群---二

1.LVS工作模式和相关命令 1.1LVS集群工作模式 - lvs-nat:修改请求报文的目标IP,多目标IP的DNAT- lvs-dr:操纵封装新的MAC地址(直接路由)- lvs-tun:隧道模式 1.1.1 LVS的NAT模式 lvs-nat:本质是多目标IP的…

flutter 使用webview

背景: 一般都有使用webview加载网页的需求,比如加载隐私协议、用户协议等。 如何做: 当然,我们自己不用封装轮子,在pub.dev上有成熟的轮子:webview_flutter 首先,将依赖导入,在pub…

MooC下载pdf转为ppt后去除水印方法

1、从MooC下载的课件(一般为pdf文件)可能带有水印,如下图所示: 2、将pdf版课件转为ppt后,同样带有水印,如下图所示: 3、传统从pdf中去除水印方法不通用,未找到有效去除课件pdf方法…

c语言指针基础(中)

指针 assert断言 要想使用assert需要包含头文件<assert.h>&#xff0c;作用是程序在运行时要确定符合某种条件,如果符合程序正常运行,如果不符合,就会报错,停止运行。 例子: int *p; assert(p!NULL)程序运行到assert这条语句时,会判断p是不是空指针,如果不是空指针程序…

LVS 负载均衡 - DR模式

一 . DR 模式 直接路由 1.介绍&#xff1a; 直接路由&#xff08;Direct Routing&#xff09;&#xff1a;简称 DR 模式&#xff0c;采用半开放式的网络结构&#xff0c;与 TUN 模式的结构类似&#xff0c;但各节点并不是分散在各地&#xff0c;而是与调度器位于同一个物…

曲线曲面 - 连续性, 坐标变换矩阵

连续性 有两种&#xff1a;参数连续性&#xff08;Parametric Continuity&#xff09;、几何连续性&#xff08;Geometric Continuity&#xff09;参数连续性&#xff1a; 零阶参数连续性&#xff0c;记为&#xff0c;指相邻两段曲线在结合点处具有相同的坐标 一阶参数连续性&…

css-通用样式按钮加号

1.实现 2.代码 html <div class"addF">&#xff0b;</div> css .addF{width:40px;font-size:25px;font-weight:600;background-color:rgb(64, 158, 255);text-align:center;color:white;height:34px;border-radius:3px;line-height:34px; }

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…

ES基础-ES优化

优化-硬件选择 Elasticsearch 的基础是 Lucene&#xff0c;所有的索引和文档数据是存储在本地的磁盘中 磁盘在现代服务器上通常都是瓶颈。Elasticsearch重度使用磁盘&#xff0c;你的磁盘能处理的吞吐量越大&#xff0c;你的节点就越稳定。这里有一些优化磁盘I/O的技巧&#x…

数据处理分类、数据仓库产生原因

个人看书学习心得及日常复习思考记录&#xff0c;个人随笔。 数据处理分类 操作型数据处理&#xff08;基础&#xff09; 操作型数据处理主要完成数据的收集、整理、存储、查询和增删改操作等&#xff0c;主要由一般工作人员和基层管理人员完成。 联机事务处理系统&#xff…