JavaSE高级篇:运行时数据区

news2024/9/28 5:31:58

文章整理自深入理解Java虚拟机

  • 第一章概述
  • 第二章:运行时数据区域
    • 一:程序计数器
    • 二:Java虚拟机栈
    • 三:Java堆
    • 四:方法区
    • 五:运行时常量池
    • 六:直接内存

第一章概述

Java程序员把内存控制的权利交给了JVM

第二章:运行时数据区域

在这里插入图片描述

Java虚拟机执行Java程序的过程会把它所管理的内存分配为若干个数据区域。这些数据区域有给各自的用途:有的随着JVM虚拟机进程启动二而一直存在(堆和方法区),有的区域随着用户线程的启动和结束进行建立和销毁(虚拟机栈、程序计数器和本地方法栈)

概念模型代表了所有虚拟机的一个统一模型概述,但是各款Java虚拟机可能实现不同,可能会通过一种更为高效的方式去实现它。

一:程序计数器

程序计数器是一块内存很小的区域,是当前线程所执行字节码的行号指示器。

字节码计时器的工作就是通过改变程序计数器当中的值来取下下一个需要执行的字节码命令。
JVM多线程是通过线程切换分配处理器的执行时间来实现的。一个处理器内核在同一时刻只能处理一个线程,线程切换回来之后可以到达正确的执行位置考得就是程序计数器存储的下一个字节码指令的位置。

线程中执行的是Java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果是native方法的话,程序计数器中的值是空。

二:Java虚拟机栈

虚拟机栈线程私有,生命周期与线程相同。

虚拟机栈秒描述的是Java方法执行的内存模型,每个方法被执行的时候虚拟机栈都会同步创建一个方法的栈帧,栈帧用于存储局部变量表,动态链接,操作数栈,方法出口等信息。

每一个方法被调用的过程就对应一个栈帧的入栈和出栈。栈的最重要的特点就是后进先出,先进后出。

局部变量表当中存放的是编译器可知的把中基本类型和引用类型类型。这里引用的不是对象本身而是对象的起始地址的引用指针或者是句柄或者是地址相关的信息。对于HotSpot虚拟机来讲肯定就是对象的实际地址了。
这些内容在局部变量表中的存储单位是变量槽。Double和Long类型占用两个,其余都是一个。编译器之后局部变量表大小(变量槽数量)已定,运行时不会改变。32位虚拟机和64位虚拟机变量槽大小是不一致的。

线程创建时申请栈空间失败的话也会发生OutOfMemoryError的。
线程请求栈深度大于虚拟机允许深度会发生StackOverflowError异常。
如果栈深度允许动态拓展的话,栈深度在动态拓展的时候如果申请不到足够的内存的话就会发生OutOfMemoryError异常。
关于动态拓展这种情况,HotSpot虚拟机不支持动态拓展。这种虚拟机只会在线程创建的时候无法获取足够的栈空间导致发生OutOfMemoryError

三:Java堆

Java堆内存是JVM管理内存最大的一块。所有线程共享,虚拟机启动时创建,唯一的目的就是为了存放对象实例,所以这里是垃圾回收的主战场。

几乎所有的对象实例都在这里分配,至少当前还是。十年前,绝对主流的HotSpot虚拟机内部垃圾收集器都是基于经典分带来设计,新生代和老年代垃圾收集器配合工作。随着垃圾收集器的发展,HotSpot当中出现了不基于经典分带的垃圾收集器。
备注:新生代包括一个伊甸园区和两个幸存者区,默认比例大小是8:1:1,除了一个新生代之后,还包括一个老年代。历史上多个垃圾回收期使用这种设计:HotSpot,Self,Smalltalk

分配缓冲区(TLAB)这玩意肯定是在新生代当中,线程私有的分配缓冲区是为了提升对象分配的效率。Java堆进行细分只是为了更快的分配内存和更好的垃圾回收。

Java堆可以处于物理上不连续的内存区域,但是逻辑上应该看做连续的。对于大对象,比如数组,多数虚拟机实现简单粗暴,可能会要求空间连续。

Java堆大小可以是固定的,也可以动态扩展。动态拓展的参数可以通过-Xmx 和 -Xms来进行设定。堆内存无法分配实例,并且无法动态扩展的时候会发生OutOfMemoryError

四:方法区

方法区是各个线程共享的区域存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存。

JDK8以前HotSpot虚拟机设计团队把垃圾收集器的分带设计拓展到方法区,HotSpot虚拟机能够管理Java堆一样,管理这个这部分内存不用专门编写这部分内存管理代码。

方法区也不需要连续的内存,可以固定大小可以动态拓展,甚至可以不进行垃圾回收。
这个区域的内存回收目标是常量池的回收和内存的卸载。

方法区无法分配新的内存的时候,就会发生OutOfMemoryError异常。

五:运行时常量池

运行时常量池时方法区的一部分

Class文件中有类的版本、字段、方法、接口信息外,还有常量池表用于存放编译器生成的各种字面量和符合引用,这部分内容类加载之后会放入到运行时常量池当中。除了Class文件中描述的符号引用之外,还会把由符号引用翻译出来的直接引用也放入到方法区的运行时常量池当中。

运行时常量池相对于Class文件的常量池还具有动态性。Java中常量编译器和运行时都会产生。运行时产生的常量放入到常量池中的方法用的最多的是String类的intern()方法。

运行时常量池是方法区的一部分,此处无法申请或者说是分配到内存的时候就会发生OutOfMemoryError异常

六:直接内存

直接内存不是JVM运行时数据区的一部分。这里也可能发生OutOfMemoryError异常

NIO的使用可以使用Native函数库直接分配堆外内存,然后通过存储在堆里面的一个DirectByteBuffer这样的对象引用直接内存中的这块区域。这样一些场景可以显著提高性能,避免了数据在堆内存和直接内存当中的来回复制。

直接内存收到物理机总内存和寻址空间的限制。我们在配置JVM参数是经常忽略这块内存的限制,导致动态扩展是发生OutOfMemoryError异常。

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

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

相关文章

Spring MVC 获取参数

1..获取参数 得到单个参数: 运行结果: 得到俩个参数: 运行结果: 得到多个参数(对象) 运行结果: 通过表单传递参数: 但是,如果我用json传递就不行了,namenul…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的3D点云分割模型

给我推荐20个比较流行的点云 3D 分割模型 这里是 20 个比较流行的点云 3D 分割模型: PointNet PointNet PointCNN Kd-Net SpiderCNN PointSIFT PointASNL PointGroup PointConv PointWeb PointGNN PointPillars PointSESA PointSNE DensePoint PointSAP PointSGN PointGCN Po…

Java 应用与数据库的关系

1.什么是数据库• 数据库就是用来存储和管理数据的仓库• 数据库存储数据的优先。2.数据库的优点• 可存储大量数据;方便检索;• 保持数据的一致性、完整性﹔安全,可共享;• 通过组合分析,可产生新数据。3.数据库的发展历程• 没有数据库,使用磁盘文件存储数据,层次…

2022年度AI亮点项目大起底,ChatGPT是你心目中的第一吗?

回顾2022年,人工智能取得了巨大进步,我有一种感觉,人工智能正在扭曲我的时间感官。谁能相信Stable Diffusion只有4个月大,而ChatGPT的出现才一个多月?感觉只是眨了眨眼,我们差点错过了一个全新的行业。 在过…

Effective_Objective-C_4协议与分类】

文章目录前言23.通过委托与数据源协议进行对象间的通信协议委托模式数据源模式要点总结24.将类的实现代码分散到便于管理的数个分类之中分类Xcode创建一个分类分类需要注意什么要点25.总是为第三方的分类名称加前缀要点26.切勿在分类里面声明属性关联对象扩展可以添加属性要点2…

用javascript分类刷leetcode20.字符串(图文视频讲解)

1143. 最长公共子序列 (medium) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删…

系分 - UML【概念】

个人总结,仅供参考,欢迎加好友一起讨论 文章目录UML - Unified Modeling LanguageUML中有4种事物结构事物行为事物分组事物注释事物UML图的分类结构型图(静态图)行为型图(动态图)UML图 - 静态图[结构型]类图…

C#枚举器和迭代器

C#枚举器和迭代器 使用foreach语句时,可以依次取出数组里面的元素,原因就是数组提供了“枚举器(Enumerator)”,枚举器知道元素的位置并返回请求项。 枚举器IEnumerator 枚举器实现了IEnumerator接口,该接…

Angular页面使用指令和路由守卫进行权限控制

在各种业务系统中,为了保证业务及数据安全,除了要求用户必须登录后才能操作外,还针对不同的角色对不同用户设置了各自的访问权限,包括确定的某个页面的权限和页面中特定元素的权限。本文记录了一种Angular页面常用的权限管理方法。…

C++:std::function模板类

一:function定义 类模板 std::function是一种通用的多态函数包装器,它的实例可以对任何可以调用的目标实体进行存储,复制和调用操作。简单的来说:C中有几种可调用对象:函数,指针,lambda表达式&…

区块链之开发命令行操作模块

文章目录功能介绍go语言中flag用法简介项目命令行具体实现链接: 区块链项目github地址项目目前进度:功能介绍 利用命令行操作区块链相较于图形用户界面来说,编写代码简单,同时也可以实现复杂的功能。命令行模块的功能应该满足&am…

Java学习笔记 --- JDBC(1)

一、JDBC概述 基本介绍 1、JDBC为访问不同的数据库提供了统一的接口,为使用者屏蔽了细节问题 2、Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 3、JDBC原理图 JDBC带来的好处 JDBC是Java提供一套用于数…

安卓移动端调用自然语言处理nlp模型【示例+源码】

安卓可以使用许多不同的方法来调用NLP模型。其中一种方法是使用现有的自然语言处理库,例如 Apache OpenNLP、 Stanford NLP 和 NLTK。这些库提供了许多常用的 NLP 功能,如分词、词干化、命名实体识别和词性标注。另一种方法是使用 TensorFlow Lite 或其他机器学习框架来加载并…

[ins 2022] 针对已见和未见群体的群体推荐中的贝叶斯归纳学习

Bayesian inductive learning in group recommendations for seen and unseen groupshttps://www.sciencedirect.com/science/article/pii/S0020025522008933摘要群组推荐是指向一组用户(即成员)推荐物品。在预测相关项目时,模型通常会面临未…

fs 文件系统模块

1、什么是 fs 文件系统模块 fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。 方法名 说明 fs.readFile() 用来读取指定文件中的内容 fs.writeFile() 用来向指定的文件中写入内容 如果要在 J…

webflux整合swagger教程V2版

1. yml文件配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.1.0.RELEASE</version></dependency><!--数据库开始--&…

python @classmethod

1..什么是classmethod classmethod是用来指定一个类的方法为类方法 长的像下面这个样子 1 2 3 class cc: classmethod def f(cls, arg1, arg2, ...): ... cls通常用作类方法的第一参数 跟self有点类似&#xff08; __init__里面的slef通常用作实例方法的第一参数)。…

vue开发环境配置Visual Studio Code配置和安装教程

方便前端vue开发&#xff0c;使用vs code插件安装详细教程&#xff0c;关于vs code可以网络上相关的教程&#xff0c;插件安装如下图所示&#xff0c;大家常用的插件可再分享&#xff0c;与我联系。 1 安装Vue语法高亮显示插件&#xff1a;vetur 2 安装vue语法提示插件&#xf…

小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我

评语 班主任评语&#xff1a; 你是一个性格内向、聪明伶俐的男孩。平时能按时完成老师布置的作业&#xff0c;学习认真&#xff0c;成绩优良&#xff0c;做事认真。但有时自己的事情还不能自己完成&#xff0c;希望你以后可以独立起来&#xff0c;遇到问题多想办法&…

高性能网关基石——OpenResty

什么是 OpenRestyOpenResty 一个基于 Nginx 的高性能 Web 平台&#xff0c;能够方便地搭建处理超高并发的动态 Web 应用、 Web 服务和动态网关。例如有名的 Kong 网关和国产新秀 ApiSIX 网关都是基于 OpenResty 来进行打造的。OpenResty 通过实现 ngx_lua 和 stream_lua 等 Ngi…