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

JVM初识

1.JVM简介

JVM是JavaVirtualMachine的简称,意为Java虚拟机。
虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。
常⻅的虚拟机:JVM、VMwave、VirtualBox。
JVM和其他两个虚拟机的区别:
1. VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;
2. JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进 ⾏了裁剪。
JVM是⼀台被定制过的现实当中不存在的计算机。

2. JVM运⾏流程

 JVM是Java运⾏的基础,也是实现⼀次编译到处执⾏的关键,那么JVM是如何执⾏的呢?

JVM执⾏流程

程序在执⾏之前先要把java代码转换成字节码(class⽂件),JVM⾸先需要把字节码通过⼀定的⽅式 类加载器(ClassLoader)把⽂件加载到内存中运⾏时数据区(RuntimeDataArea),⽽字节码⽂ 件是JVM的⼀套指令集规范,并不能直接交给底层操作系统去执⾏,因此需要特定的命令解析器**执 ⾏引擎(ExecutionEngine)**将字节码翻译成底层系统指令再交由CPU去执⾏,⽽这个过程中需要 调⽤其他语⾔的接⼝本地库接⼝(NativeInterface)来实现整个程序的功能,这就是这4个主要组成 部分的职责与功能。

总结来看,JVM主要通过分为以下4个部分,来执⾏Java程序的,它们分别是:
1. 类加载器(ClassLoader)
2. 运⾏时数据区(RuntimeDataArea)
3. 执⾏引擎(ExecutionEngine)
4. 本地库接⼝(NativeInterface)

3. JVM运⾏时数据区

JVM运⾏时数据区域也叫内存布局,但需要注意的是它和Java内存模型((JavaMemoryModel,简 称JMM)完全不同,属于完全不同的两个概念,它由以下5⼤部分组成:

3.1 堆(线程共享)

堆的作⽤:程序中创建的所有对象都在保存在堆中。 我们常⻅的JVM参数设置-Xms10m最⼩启动内存是针对堆的,-Xmx10m最⼤运⾏内存也是针对堆 的。

ms是memorystart简称,mx是memorymax的简称。

堆⾥⾯分为两个区域:新⽣代和⽼⽣代,新⽣代放新建的对象,当经过⼀定GC次数之后还存活的对象 会放⼊⽼⽣代。新⽣代还有3个区域:⼀个Endn+两个Survivor(S0/S1)。

垃圾回收的时候会将Endn中存活的对象放到⼀个未使⽤的Survivor中,并把当前的Endn和正在使 ⽤的Survivor清除掉。

3.2 Java虚拟机栈(线程私有)

Java 虚拟机栈的作⽤:Java虚拟机栈的⽣命周期和线程相同,Java虚拟机栈描述的是Java⽅法执⾏ 的内存模型:每个⽅法在执⾏的同时都会创建⼀个栈帧(StackFrame)⽤于存储局部变量表、操作数 栈、动态链接、⽅法出⼝等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈。

Java 虚拟机栈中包含了以下4部分:

1. 局部变量表:存放了编译器可知的各种基本数据类型(8⼤基本数据类型)、对象引⽤。局部变量表 所需的内存空间在编译期间完成分配,当进⼊⼀个⽅法时,这个⽅法需要在帧中分配多⼤的局部变 量空间是完全确定的,在执⾏期间不会改变局部变量表⼤⼩。简单来说就是存放⽅法参数和局部变 量。
2. 操作栈:每个⽅法会⽣成⼀个先进后出的操作栈。
3. 动态链接:指向运⾏时常量池的⽅法引⽤。
4. ⽅法返回地址:PC寄存器的地址。
什么是线程私有?
由于JVM的多线程是通过线程轮流切换并分配处理器执⾏时间的⽅式来实现,因此在任何⼀个确定的 时刻,⼀个处理器(多核处理器则指的是⼀个内核)都只会执⾏⼀条线程中的指令。因此为了切换线程后 能恢复到正确的执⾏位置,每条线程都需要独⽴的程序计数器,各条线程之间计数器互不影响,独⽴ 存储。我们就把类似这类区域称之为"线程私有"的内存。

3.3 本地⽅法栈(线程私有)

本地⽅法栈和虚拟机栈类似,只不过Java虚拟机栈是给JVM使⽤的,⽽本地⽅法栈是给本地⽅法使 ⽤的。

4.JVM类加载

①类加载过程 从上⾯的图⽚我们可以看出整个JVM执⾏的流程中,和程序员关系最密切的就是类加载的过程了,所 以接下来我们来看下类加载的执⾏流程。 对于⼀个类来说,它的⽣命周期是这样的:

其中前5步是固定的顺序并且也是类加载的过程,其中中间的3步我们都属于连接,所以对于类加载 来说总共分为以下⼏个步骤:

1. 加载

2. 连接 a. 验证 b. 准备 c. 解析

3. 初始化 下⾯我们分别来看每个步骤的具体执⾏内容。

什么是双亲委派模型?

如果⼀个类加载器收到了类加载的请求,它⾸先不会⾃⼰去尝试加载这个类,⽽是把这个请求委派给 ⽗类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层 的启动类加载器中,只有当⽗加载器反馈⾃⼰⽆法完成这个加载请求(它的搜索范围中没有找到所需 的类)时,⼦加载器才会尝试⾃⼰去完成加载。

双亲委派模型的优点

1. 避免重复加载类:⽐如A类和B类都有⼀个⽗类C类,那么当A启动时就会将C类加载起来,那 么在B类进⾏加载时就不需要在重复加载C类了。
2. 安全性:使⽤双亲委派模型也可以保证了Java的核⼼API不被篡改,如果没有使⽤双亲委派模 型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为java.lang.Object 类的话,那么程序运⾏的时候,系统就会出现多个不同的Object类,⽽有些Object类⼜是⽤⼾⾃ ⼰提供的因此安全性就不能得到保证了。
http://www.dtcms.com/a/482904.html

相关文章:

  • 最小二乘问题详解4:非线性最小二乘
  • pcba方案开发|车载智能充气泵
  • c++项目篇:高并发内存池项目开发记录01
  • wordpress wp_term_taxonomy优化网站哪家好
  • 怎么选择宜昌网站建设沈阳网站建设与开发
  • SQL提数与数据分析指南
  • 新手用Godot打造2D像素风游戏
  • 框架--SpringMVC
  • 做外贸网站注意wordpress 附件下载插件
  • 微波人体传感器技术深度解析:从多普勒效应到工程落地
  • 定长内存池 思考实现过程 C++ 附源码
  • 风电场站AGC/AVC系统方案|风力发电AGC/AVC系统方案|风电场站一次调频系统方案|风力发电一次调频系统产品方案概述
  • sward,一款超级轻量且简洁的知识管理工具
  • 类似京东的购物网站开发价格课程设计代做网站推荐
  • 网站开发毕业设计开题报告手机怎么安装网站程序
  • python调用远程服务器的ollama embedding模型
  • 手机电子商务网站建设怎么做网站排名优化
  • SQL入门:行列转换实战-从基础到高级
  • 科大讯飞【免费】的开源模型实现录音转写与角色判定
  • 上海专业建设网站制作微信群推广
  • 景区网站建设原则做网站需要每年都缴费吗
  • 推广一下自己刚撸的 IDEA 插件—Bean Copy 助手
  • 线粒体靶向压电催化剂调控焦亡与胞葬作用以增强骨肉瘤免疫原性死亡
  • Vue 3 + TypeScript 开发的视频直播页面组件
  • 【开题答辩实录分享】以《智能体育训练助手的设计与实现》为例进行答辩实录分享
  • Vue + Element Plus 手动注册 v-loading 指令
  • docker elasticsearch端口映射解决端口冲突问题
  • SD:在一个 Ubuntu 系统安装 stable diffusion ComfyUI
  • 如何使用命令修改conda虚拟环境目录
  • 学习随笔-ES6和ES5的区别