JVM(运行时数据区)

  • 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。

  • 1、线程私有程序计数器、虚拟机栈、本地方法栈(随着线程的开始和结束)
  • 2、线程共享堆、方法区(随着虚拟机的启动和创建)
  • 3、线程:在Hostspot JVM里,每个java线程都与操作系统的本地线程直接映射。当一个java线程准备好执行以后,此时一个操作系统的本地线程也同时创建;本地线程初始化成功,它就会调用java线程中的run()方法;java线程执行终止后,本地线程也会回收。
  • 一、程序计数器:(线程私有)
    • 1、作用:PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。通过改变PCR依次读取指令,实现代码的流程控制。
    • 2、解释:
      • 一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。分支,循环,跳转,异常处理,线程恢复等都需要依赖这个计数器来完成。
      • 由于Java的多线程是通过线程轮流切换完成的,一个线程没有执行完时就需要一个东西记录它执行到哪了,下次抢占到了CPU资源时再从这开始,这个东西就是程序计数器,正是因为这样,所以它也是“线程私有”的内存。
      • 如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。(正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是 Native 方法,则为空。)
      • 这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。(没有GC OOM)
  • 二、虚拟机栈:(线程私有)
    • 1、解释:
      • 虚拟机栈描述的是 Java 方法执行的线程内存模型:每个方法被执行的时候,java虚拟机都会同步创建一个栈帧(Stack Ftame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
      • Java栈也称作虚拟机栈(Java Vitual Machine Stack),也就是我们常常所说的栈。事实上,虚拟机栈描述的是Java方法执行的线程内存模型。栈中的元素用于支持虚拟机进行方法调用,Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。
      • 栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器。
      • 线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。所以在使用递归方法的时候容易导致栈内存溢出的现象,以及栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己垃圾回收机制),这部分空间的分配和释放都是由系统自动实施的。对于所有的程序设计语言来说,栈这部分空间对程序员来说是不透明的。
      • 设置栈的大小:
        • java虚拟机规范允许java栈的大小是动态的或者是固定不变。固定大小会溢出 StackOverflwError 异常;动态扩展会溢出 OutOfMemoryError。
        • 设置栈:Run - Edit Configurations - 选择程序 - Configuration - VM options : -Xss245k(例)。
    • 2、栈帧:
      • 在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池的引用(动态链接)(Reference to runtime constant pool)、方法返回地址(Return Address)和一些附加信息。
      • 局部变量表(局部变量数组或本地方法栈):
        • 定义:定义为一个数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用,以及returnAddress类型。
        • 由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。
        • 局部变量表所需要的内存空间在编译期间完成分配,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。
      • 操作数栈:
        • 存储方法内一些进行了运算操作后的结果。
        • 一个初始状态为空的桶式结构栈。由于 Java 没有寄存器,所有参数传递使用操作数栈。在方法执行过程中,会有各种指令往栈中写入和提取信息。JVM的执行引擎是基于栈的执行引擎,其中的栈指的就是操作栈。
        • JVM底层字节码指令集是基于栈类型的,所有的操作码都是对操作数栈上的数据进行操作,栈的深度在方法元信息的stack属性中。
      • 动态连接:
        • 每个栈帧中包含一个在常量池中对当前方法的引用,目的是支持方法调用过程的动态连接。
        • 每一个栈帧内部都包含一个指向运行时常量池或该栈帧所属方法的引用,为了支持当前方法的代码能够实现动态链接。
        • 在Java源文件被编译成字节码文件时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里, 那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
      • 方法返回地址:
        • 用于存放调用该方法的PC寄存器的值。当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。
        • 一个方法的结束退出有两种方式:正常执行退出、异常执行退出。无论通过哪种方式,在方法结束后都返回到该方法被调用的位置。方法正常退出时,返回地址为调用者PC计数器的值( 即调用该方法的指令的下一条指令地址 )。方法异常退出时,返回地址则是通过异常表来确定的,栈帧中一般不会保存这部分信息
        • 正常执行退出和异常执行退出的区别在于:通过异常执行退出的不会给它的上层调用者产生任何的返回值
        • 事实上,方法的退出就是当前栈帧出栈的过程。此时,需要恢复上层方法的局部变量表、操作数栈、将返回值压入调用者栈帧的操作数栈、设置PC寄存器值等,目的是使调用者方法继续执行下去
  • 三、本地方法栈:(线程私有)
    • 本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。
    • 《Java 虚拟机规范》对本地方法栈中方法使用的语言、使用方式与数据结构并没有任何强制规定,因此具体的虚拟机可以根据需要自由实现它,甚至有的 Java 虚拟机(如 HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。
  • 四、Java堆:(线程共享)
    • Java堆(Java Heep)是虚拟机所管理的内存中最大的一块。Java对是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里 “几乎” 所有的对象实例都在这里分配内存。Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。Java 堆是垃圾收集器管理的内存区域(GC 堆)
    • 从回收内存的角度看:由于现代垃圾收强器大部分都是基于分代收集理论设计的,所以 Java 堆中经常会出现“新生代”、“老年代”、“永久代”、“Eden 空间”、“From Survivor 空间”、“To Survivor空间”等名词。这些区域划分仅仅是一部分垃圾收集器的共同特性或者说设计风格而已,而非某个 Java 虚机具体实现的固有内存布局,更不是《Java虚拟机规范》里对Java堆的进一步细致划分。
    • 从分配内存的角度看:所有线程共享的 Java 堆中可以划分出多个线程私有的分配缓冲区(Thread LocalAllocation Buffer,TLAB),以提升对象分配时的效率。不过无论从什么角度,无论如何划分,都不会改变 Java 堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将 Java 堆细分的目的只是为了更好地回收内存,或者更快地分配内存。
  • 五、方法区:(线程共享)
    • 它用于存储被虚拟机加载的类型信息(类名、访问修饰符、字段描述、方法描述)、常量(运行时常量池)、静态变量、即时编译器编译后的代码缓存等数据。
    • JDK8以前,当时的 HotSpot 虚拟机设计团队选择把收集器的分代设计扩展至方法区,或者说使用永久代来实现方法区而已,这样使得 HotSpot 的垃圾收集器能够像管理 Java 堆一样管理这部分内存,省去专门为方法区编写内存管理代码的工作。JDK7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移至 Java 堆中,到了JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Meta-space) 来代替,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。
    • 这区域的内存回收目标主要是针对常量池的回收和对类型的卸载。
    • 运行时常量池:
      • 是方法区的一部分。用于存放编译期生成的各种字面量和符号引用,运行时常量池相对于类常量池另外一个特性就是具备动态性,运行期间可能将新的常量放入池中。
  • 六、直接内存:
    • 直接内存 (Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《 Java虚拟机规范》中定义的内存区域。
    • 在JDK 1.4中新加人了NIO(New Input/Output)类,引人了一种基于通道(Channel)与缓冲区(Buffer)的I/0方式,它可以使用Native 函数库直接分配堆外内存,然后通过一个存储在Java堆里面的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和Native 堆中来回复制数据。
  • 参考:
    • https://javaedge.blog.csdn.net/article/details/116423830?spm=1001.2014.3001.5506
    • JVM运行时数据区篇(虚拟机栈帧结构)_编程小吉的博客-CSDN博客^v76^pc_search_v2,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187

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

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

相关文章

手把手教你如何使用Docker

手把手教会你如何使用Docker!!! 一、Docker介绍 我们在公司开发中,会有开发环境,测试环境,上线环境, 比如我们开发人员开发好了一个项目,在开发环境中运行正常,但测试人…

在Linux系统中实现一个可加载的内核模块

Intro 坐标成都电讯大专, 某操作系统课老师在PPT上草草写下3个内核线程API后就要求编程, 感受一下: include/linux/kthread.h,你就看到了它全部的API,一共三个函数。 这里是代码声明,略 kthread_run()负责内核线程的创建, kthre…

eclipse安装MAT内存分析工具插件

(一)默认已安装eclipse IDE 打开eclipse选择如下操作: 插件地址:http://download.eclipse.org/mat/1.5/update-site/ 安装插件。 安装完成后重启即可。 (二)获取Heap Dump文件 新建一个java项目&#xff0c…

【深度学习·实践篇】CodeT5模型学习与基于CodeT5进行新的模型训练

文章目录 写在前面一. 一些名词二. 基于Codet5训练自己的模型理论步骤:1. 安装依赖2. 下载CodeT5代码库3. 准备数据集4. 修改训练脚本5. 启动训练6. 进行预测 具体实践1. 准备数据集2. 配置运行环境3. 修改脚本参数4. 为实现分布式训练,修改脚本如何实现…

虚拟机安装Ubuntu18.04

一、下载VMware VMware下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 安装这个太久了,可以网上搜一下安装流程不难,只有一个建议,安装路径不要有中文 可以参考下面教程&#xff0c…

智能PID软件-AVEVA Diagrams创建图纸模板【图瓦软件出品】

AVEVA Diagrams可以针对不同的项目,定义公司级和项目级的图纸模板,包括图纸图框和角图章。不仅大大节约设计人员的时间,而且能够确保成品图纸的一致性和规范性。下面我们介绍一下如何在Diagrams中定制图纸模板,初步了解一下Diagra…

5 款必备的免费在线画图工具!超级好用

大家好,我是宝哥! zen flowchart 虽然是英文,但其实也并没有多么复杂的内容,而且浏览器现在都带有页面翻译的功能,所以还是蛮方便的!初次使用需要注册,也并不难,随便自己的一个邮箱注…

最新ChatGPT开源平替模型骆马(Vicuna) 单个GPU就能跑!UC伯克利领头,130亿参数「小羊驼」权重公布

转载:单个GPU就能跑!UC伯克利领头,130亿参数「小羊驼」权重公布 【导读】刚刚,UC伯克利、CMU、斯坦福等,联手发布了最新开源模型骆马(Vicuna)的权重。 3月31日,UC伯克利联手CMU、斯…

试用国内及国外AI绘图软件后的总结

最近AI很火,所以这几天抱着试试看的角度试用了多款AI绘图软件,大概测试了市面上的3款工具吧,3款国外的,1款国内的。 因为有对比,波哥也不是专业的评测机构出身,所以这些比对无论是从角度,还是从…

这家付费图库巨头率先拥抱AI绘画,还掏钱补偿原创画师

詹士 发自 凹非寺量子位 | 公众号 QbitAI 画师与AI生成图片争议不断,有平台给出了解决方案。 而且是掏真金白银补偿创作者那种。 美东时间10月25日,付费图库Shutterstock宣布:将通过出售AI生成图片,向创作者提供补偿费&#xff0c…

OpenAI 发布GPT-4——全网抢先体验

OpenAI 发布GPT-4 最近 OpenAI 犹如开挂一般,上周才刚刚推出GPT-3.5-Turbo API,今天凌晨再次祭出GPT-4这个目前最先进的多模态预训练大模型。与上一代GPT3.5相比,GPT-4最大的飞跃是增加了识图能力,并且回答准确性也得到显著提高。…

GPT-4正式发布!如何访问 怎么免费使用GPT-4?

美国人工智能研究实验室OpenAI,周二为其爆红聊天机器人ChatGPT发布了最新GPT-4语言模型,这距离ChatGPT的上线仅仅过去了4个月时间。 和ChatGPT最初使用的GPT-3.5模型相比,GPT-4实现了几个方面的飞跃式提升:强大的识图能力&#x…

谷歌Bard最新更新:支持中文,还升级了ChatGPT都没有的识图功能

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 两个月前咱们刚盘点完 Bard 的大更新,在那两周中,谷歌将全家桶和 Bard 联动不久,还推出了十大新功能,当时他们就在博客更新中提到,会在今年夏天新增对中文等另外 40…

GPT-4来炸场:10秒输出一个网站,识图知意 so easy,为何如此丝滑

比被卷更可怕的莫过于自己卷自己,这点还得是OpenAI更胜一筹。 四个月前,ChatGPT 刚刚推出,并成为历史上增长最快的消费者应用程序。在ChatGpt大杀四方时,万众瞩目的大型多模态模型GPT-4也在今天凌晨正式发布。 据OpenAI官方介绍&…

使用GPT-4生成QT代码

一、概述 最近ChatGPT火爆起来了,ChatGPT是一种基于GPT的自然语言处理模型,可以用于生成自然语言文本,例如对话、文章等。最近又发现了一个优秀且免费的代码生成工具Cursor ,Cursor集成了 GPT-4 ,可以帮助你快速编写、…

chatgpt赋能python:Python如何查看图片

Python如何查看图片 在SEO优化中,图片也是至关重要的一部分。而在Python中,我们可以使用一些代码来查看图片。下面就来介绍一下Python如何查看图片的方法。 1. 安装Python相关库 要使用Python查看图片,需要先安装一些相关的库。常用的库包…

ChatGPT之后,垂直大模型兴起

由ChatGPT掀起的这一波大模型浪潮中, 百度、阿里等大厂相继下场,王慧文、王小川、李开复等大佬也纷纷入场。年初,比尔盖茨高呼“人工智能时代已经开始”,给大模型定下了宏伟的基调。随着竞争的展开,大模型已不是“是否”问题&…

大佬下场AI2.0,我们帮“王慧文们”指条明路

划重点: 1、如果将开发大模型比做是“造房子”,那AI Infra 就是“工具箱”,而中国缺少的正是工具和原材料制造工厂。 2、根据国外市场的情况,可以将整个AI Infra大致分为数据准备、模型构建、模型产品三个层面,在这三…

win10系统提示 “你的账户已被停用,请向系统管理员咨询” 如何解决 ?

今天有位朋友,可以是不知道是为了寻求刺激,还是刷存在感, 把自己的win10系统管理员账号 Administrator 将用户给禁用了,并且注销完开机后,就是电脑突然提示“你的账户已被停用,请向系统管理员咨询”如图 : 解决方法 此情况可以长按电源键强制关机再开机…

google账号已停用(已解决)

很久没登陆Google邮箱了 近期想使用google diver发现账号被停用了 进行申请,但是一直没恢复 记录一下解决方法: 1、手机上下载谷歌邮箱和商店 2、科学进入谷歌邮箱 我是想再创建一个号的,在创建的过程中,app提示我已经有一个谷…