JVM五大内存模型

什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一个虚构出来的计算机,有着自己完善的硬件架构,如处理器、堆栈等。

JVM的作用

Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码( 字节码 ),就可以在多种平台上不加修改地运行。

Java文件必须先通过一个叫javac的编译器,将代码编译成class文件,然后通过JVM把class文件解释成各个平台可以识别的机器码,最终实现跨平台运行代码。

JVM内存模型

JVM内存模型可以分为两个部分,堆和方法区是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。

堆(Heap)

Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

可能存在的异常

  1. OutOfMemoryError:当堆中没有足够的内存分配给新的对象时抛出。这可能是由于堆空间不足、内存泄漏或对象过多等原因导致。

  2. StackOverflowError:当线程的调用栈空间超过其限制时抛出。这通常是由于无限递归或者方法调用层次过深引起的。

  3. HeapDumpOutOfMemoryError:当堆内存不够用时,JVM可能会生成一个堆转储文件(Heap Dump)以供分析。这通常发生在OutofMemoryError之后,用于帮助开发人员诊断内存问题。

  4. PermGen space/ Metaspace OutOfMemoryError:在Java 7及之前的版本中,常见于永久代(PermGen)内存区域不足的情况。而在Java 8及之后的版本中,永久代被元空间(Metaspace)所取代,因此抛出的错误会是Metaspace OutOfMemoryError。

  5. ConcurrentModeFailureException:在并发标记清除垃圾回收器(CMS)中,当GC线程无法跟上应用程序生成的垃圾量时,会抛出此异常。这可能是由于堆中对象数量过多或者垃圾回收器参数配置不合理导致。

方法区(Method Area)

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

可能存在的异常

  1. OfMemoryError:当方法区没有足够的内存分配给新的类元数据、常量池等时抛出。这可能是由于方法区空间不足、加载过多的类或者大量的字符串常量等原因导致。
  2. PermGen space/ Metaspace OutOfMemoryError:在Java 7及之前的版本中,常见于永久代(PermGen)内存区域不足的情况。而在Java 8及之后的版本中,永久代被元空间(Metaspace)所取代,因此抛出的错误会是Metaspace OutOfMemoryError。
  3. ClassLoader相关异常:在方法区中,类加载器负责加载和链接类的过程。如果类加载器出现问题,可能会导致ClassNotFoundException、NoClassDefFoundError等异常。
  4. 频繁Full GC:如果方法区中存储的类元数据、常量池等对象无法被垃圾回收,则可能导致频繁进行Full GC(全局垃圾回收),从而影响应用程序的性能。

需要注意的是,在Java 8及之后的版本中使用元空间(Metaspace)替代了永久代(PermGen),因此一些特定于永久代的异常,如PermGen space OutOfMemoryError,在Java 8及之后的版本中不再出现。而Metaspace OutOfMemoryError则是对应的异常。

程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。

在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。

当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址;如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空(Underfined)。

可能存在的异常

程序计数器可能存在的异常情况主要是线程相关的问题,例如:

  1. 线程死循环:如果线程陷入死循环,程序计数器会一直指向循环的字节码指令地址,不会发生变化。这可能导致程序无法继续执行其他逻辑。

  2. 线程切换错误:在多线程环境中,JVM会通过线程切换来实现并发执行。程序计数器记录了每个线程当前执行的位置,在线程切换时需要正确保存和恢复计数器的值。如果出现错误,可能导致线程执行位置错乱或者执行结果异常。

  3. 虚拟机实现错误:JVM的实现可能存在bug或者错误,导致程序计数器的行为异常。这种情况比较少见,但仍有可能发生。

虚拟机栈(JVM Stacks)

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。

虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

可能存在的异常

  1. StackOverflowError:当线程的调用栈空间超过其限制时抛出。这通常是由于无限递归或者方法调用层次过深引起的。每个线程在JVM中都有一个对应的虚拟机栈,当栈空间耗尽时会抛出StackOverflowError。

  2. OutOfMemoryError:当虚拟机栈无法继续分配新的栈帧时抛出。每个线程在JVM中都有一个对应的虚拟机栈,用于保存方法调用的信息。如果创建的线程过多或者每个线程的栈帧太大,将消耗掉可用的虚拟机栈空间,导致无法分配新的栈帧,从而抛出OutOfMemoryError。

  3. StackOverflowError和OutOfMemoryError都是虚拟机栈相关的异常,但它们的原因和解决方法不同。StackOverflowError通常是由于方法调用层次过深或者无限递归引起的,需要检查代码逻辑并修复。而OutOfMemoryError则可能是由于线程数过多或者每个线程的栈帧太大,可以通过调整JVM参数来增加虚拟机栈的大小。

本地方法栈(Native Method Stacks)

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。

可能存在的异常

  1. StackOverflowError:当本地方法栈空间超过其限制时抛出。本地方法栈的大小是由JVM参数决定的,一般较小。如果本地方法递归调用层次太深或者本地方法栈帧太大,超出了栈空间限制,就会抛出StackOverflowError。

  2. OutOfMemoryError:当无法分配新的本地方法栈帧时抛出。本地方法栈的大小是有限的,如果创建的线程过多或者每个线程的本地方法栈帧太大,将耗尽可用的本地方法栈空间,导致无法分配新的栈帧,从而抛出OutOfMemoryError。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Istio Pilot源码学习(三):xDS的异步分发

本文基于Istio 1.18.0版本进行源码学习 5、xDS的异步分发 DiscoveryService主要包含下述逻辑: 启动GRPC Server并接收来自Envoy端的连接请求接收Envoy端的xDS请求,从ConfigController和ServiceController中获取配置和服务信息,生成响应消息…

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题 三、要求用最小堆实现最小优先队列,请写出 HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP DECREASE-KEY 和 MIN-HEAP-INSERT 的伪代码。 文心一言: 以下是使用最小堆实现最小…

国内攻克OLED屏幕修复术,成本暴降2/3不用拆机换屏

连着许多年各家手机发布会,屏幕基本是会花大精力宣传的三大件之一 也对,无论是外观还是实际的视觉、操作体验,屏幕都是非常重要的一环。 屏幕素质越来越高,用着也的确更爽了,但也越来越不敢摔了。 普普通通的一块 60…

【传感器】应用充气泵方案的压力传感器

压力传感器,是指以膜片装置(不锈钢膜片、硅酮膜片等)为媒介,用感压元件对气体和液体的压力进行测量,并转换成电气信号输出的设备。其原理是半导体压电阻抗扩散压力传感器是在薄片表面形成半导体变形压力,通…

SNMP协议是什么?

SNMP协议是什么? 简单网络管理协议(Simple Network Management Protocol,SNMP)是由互联网工程任务组定义的一套网络管理协议。该协议是基于简单网关监视协议(Simple Gateway Monitor Protocol,SGMP&#x…

ChatGPT助力校招----面试问题分享(十二)

1 ChatGPT每日一题:运算放大器与比较器的区别 问题:运算放大器与比较器的区别 ChatGPT:运算放大器和比较器都是电子电路中常用的模拟电路元件,但它们的设计和应用略有不同。下面是两者的主要区别: 功能不同&#xf…

TC3XX - MCAL知识点(十一):WDG EB-tresos配置说明与代码浅析

目录 1、概述 1.1、简介 1.2、Safety Watchdog 1.3、CPU Watchdogs 1.4、看门狗定时器的功能列表

服务器负载均衡算法有哪些

算法举例 服务器负载均衡算法是用于分配网络流量到多个服务器的策略,以实现负载均衡和提高系统性能。以下是一些常见的服务器负载均衡算法的详细说明: 轮询(Round Robin)算法: 轮询算法是最简单且常见的负载均衡算法之…

2.python设计模式【面向对象设计的SOLID原则 基础概念】

1.可放封闭原则 概念:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应该尽量在不修改原有代码的情况下进行扩展 2.里式替换原则 概念:所有引用父类的地方必须能透明地使用其子类的对象 3.依赖倒置原则 概念&#…

qs.stringify() 和 JSON.stringfy 的区别

qs 是 nodejs 的一个模块。qs.stringify()常用于对象转url参数;qs.parse()常用户url参数转对象; JSON.stringfy是js自带的方法。 JSON.stringify()用于对象转字符串;JSON.parse()用于字符串转对象; 两者都能进行序列化&#xff0c…

若依日志打印入参,返回参数,日志切面打印接口调用,出现一个接口多次调用的情况且,多次调用返回值为null,initBinder的原因。

使用若依Springboot项目,Controller均继承BaseController。 这里若依原日志切面不会打印接口请求参数,返回参数等信息,这里我做了修改。 修改后日志打印出现一个接口调用4次,5次的情况 15:08:58.342 [http-nio-8082-exec-4] INF…

DevOps系列文章之 Git知识大全

常用命令 其他参数 --inital-branch 初始化的分支 --bare 创建一个裸仓库(纯 Git 目录,没有工作目录) --template 可以通过模板来创建预先建好的自定义 git 目录 常见 Git 配置 用户名配置 git config --global user.name "yourname&qu…

Oracle压缩数据

Oracle压缩数据的处理基于数据库块,其本质上是通过消除在数据库块中的重复数据来实现空间节约,具体方法如下:比较数据块中包含的所有字段或记录,其中重复的数据只在位于数据块开始部分的记号表(Symbol Table&#xff0…

基于Springboot的汽车租赁系统

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。…

信息熵和决策树

在预测分析领域,决策树是可应用于回归和分类任务的算法之一 决策树背后的想法是,根据数据集中的特征对当时响应变量的贡献方式,递归地构建一个颠倒的树状结构。 在每次迭代中,将以使得所得模型最小化成本函数的方式选择特征。 该结…

cmder 使用简介

文章目录 1. cmder 简介2. 下载地址3. 安装4. 配置环境变量5. 添加 cmder 到右键菜单6. 解决中文乱码问题 1. cmder 简介 cmder 是一个增强型命令行工具,不仅可以使用 windows 下的所有命令,更爽的是可以使用 linux的命令, shell 命令。 2. 下载地址 …

选择合适的图表,高效展现数据魅力

随着大数据时代的来临,数据的重要性愈发凸显,数据分析和可视化成为了决策和传递信息的重要手段。在数据可视化中,选择合适的图表是至关重要的一环,它能让数据更加生动、直观地呈现,为观众提供更有说服力的信息。本文将…

模型构建——使用逻辑回归构建模型,lightGBM进行特征筛选

1、模型构建流程 1.1 实验设计 新的模型要跟原有方案对比,而且是通过实验证明,特别注意模型和策略不能同时调整。一般实验设计包含以下流程: 问题:业务稳定后,可以去掉人工审核吗? 答:不可以…

React拆分窗格组件

React拆分窗格的两种方法 react-split-pane 使用第三方库react-split-pane的优点: 方便快捷:使用现有的第三方库可以快速实现拆分窗格功能,无需自己编写复杂的逻辑。 功能丰富:第三方库通常提供了许多可配置的选项和功能&…

c语言练手项目【编写天天酷跑游戏2.0】EASYX图形库的运用。代码开源,素材已打包

天天酷跑项目的开发 项目前言 项目是基于Windows,easyX图形库进行开发的, 开发环境:Visual Studio 2022 项目技术最低要求: 常量,变量,数组,循环,函数。 文章目录 天天酷跑项目的…