JVM - 内存分配
目录
JVM的简化架构和运行时数据区
JVM的简化架构
运行时数据区
PC寄存器
Java栈
Java堆
方法区
运行时常量池
本地方法栈
栈、堆、方法区交互关系
Java堆内存模型和分配
Java堆内存概述
Java堆的结构
对象的内存布局
对象的访问定位
Trace跟踪和Java堆的参数配置
Trace跟踪参数
GC日志格式
Java堆的参数
元空间的参数
-
JVM的简化架构和运行时数据区
-
JVM的简化架构
-
运行时数据区
- 包括:PC寄存器、Java虚拟机栈、Java堆、方法区、运行时常量池、本地方法栈等
-
PC寄存器
- PC(Program Counter)寄存器说明:
- (1)每个线程拥有一个PC寄存器,是线程私有的,用来存储指向下一条指令的地址
- (2)在创建线程的时候,创建相应的PC寄存器
- (3)执行本地方法时,PC寄存器的值为undefined
- (4)是一块较小的内存空间,是唯一一个在JVM规范中没有规定OutOfMemoryError的内存区域
-
Java栈
- 栈由一系列帧(Frame)组成(因此Java栈也叫做帧栈),是线程私有的
- 帧用来保存一个方法的局部变量、操作数栈(Java没有寄存器,所有参数传递使用操作数栈)、常量池指针、动态链接、方法返回值等
- 每一次方法调用创建一个帧,并压栈,退出方法的时候,修改栈顶指针就可以把栈帧中的内容销毁
- 局部变量表存放了编译期可知的各种基本数据类型和引用类型,每个slot存放32位的数据,long、double占两个槽位
- 栈的优点:存取速度比堆快,仅次于寄存器
- 栈的缺点:存在栈中的数据大小、生存期是在编译期决定的,缺乏灵活性
-
Java堆
- 用来存放应用系统创建的对象和数组,所有线程共享Java堆
- GC主要就管理堆空间,对分代GC来说,堆也是分代的
- 堆的优点:运行期动态分配内存大小,自动进行垃圾回收;
- 堆的缺点:效率相对较慢
-
方法区
- 方法区是线程共享的,通常用来保存装载的类的结构信息
- 通常和元空间关联在一起,但具体的跟JVM实现和版本有关
- JVM规范把方法区描述为堆的一个逻辑部分,但它有一个别名称为Non-heap(非堆),应是为了与Java堆区分开
-
运行时常量池
- 是Class文件中每个类或接口的常量池表
- 在运行期间的表示形式,通常包括:类的版本、字段、方法、接口等信息
- 在方法区中分配
- 通常在加载类和接口到JVM后,就创建相应的运行时常量池
-
本地方法栈
- 在JVM中用来支持native方法执行的栈就是本地方法栈
-
栈、堆、方法区交互关系
-
Java堆内存模型和分配
-
Java堆内存概述
- Java堆用来存放应用系统创建的对象和数组,所有线程共享Java堆
- Java堆是在运行期动态分配内存大小,自动进行垃圾回收
- Java垃圾回收(GC)主要就是回收堆内存,对分代GC来说,堆也是分代的
-
Java堆的结构
- 新生代用来放新分配的对象
- 新生代中经过垃圾回收,没有回收掉的对象,被复制到老年代
- 老年代存储对象比新生代存储对象的年龄大得多
- 老年代存储一些大对象
- 整个堆大小 = 新生代 + 老年代
- 新生代 = Eden + 存活区
- 从前的持久代,用来存放Class、Method等元信息的区域,从JDK8开始去掉了,取而代之的是元空间(MetaSpace)
- 元空间并不在虚拟机里面,而是直接使用本地内存
-
对象的内存布局
- 对象在内存中存储的布局(这里以HotSpot虚拟机为例来说明)
- 分为:对象头、实例数据和对齐填充
- 对象头,包含两个部分:
- (1)Mark Word:存储对象自身的运行数据,如:
- HashCode、GC分代年龄、锁状态标志等
- (2)类型指针:对象指向它的类元数据的指针
- (1)Mark Word:存储对象自身的运行数据,如:
- 实例数据
- 真正存放对象实例数据的地方
- 对齐填充
- 这部分不一定存在,也没有什么特别含义,仅仅是占位符
- 因为HotSpot要求对象起始地址都是8字节的整数倍,如果不是,就对齐
-
对象的访问定位
- 在JVM规范中只规定了reference类型是一个指向对象的引用,但没有规定这个引用具体如何去定位、访问堆中对象的具体位置
- 因此对象的访问方式取决于JVM的实现
- 目前主流的有:使用句柄或使用指针两种方式
- 使用句柄:
- Java堆中会划分出一块内存来做为句柄池,reference中存储句柄的地址
- 句柄中存储对象的实例数据和类元数据的地址,如下图所示:
- 使用指针:
- Java堆中会存放访问类元数据的地址
- reference存储的就直接是对象的地址,如下图所示:
-
Trace跟踪和Java堆的参数配置
-
Trace跟踪参数
- 可以打印GC的简要信息:-Xlog:gc
- 打印GC详细信息:-Xlog:gc*
- 指定GC log的位置,以文件输出:-Xlog:gc:garbage-collection.log
- 每一次GC后,都打印堆信息:-Xlog:gc+heap=debug
-
GC日志格式
- GC发生的时间,也就是JVM从启动以来经过的秒数
- 日志级别信息,和日志类型标记
- GC识别号
- GC类型和说明GC的原因
- 容量:GC前容量->GC后容量(该区域总容量)
- GC持续时间,单位秒
- 有的收集器会有更详细的描述,比如:user表示应用程序消耗的时间,sys表示系统内核消耗的时间、real表示操作从开始到结束的时间
-
Java堆的参数
- Xms:初始堆大小,默认物理内存的1/64
- Xmx:最大堆大小,默认物理内存的1/4
- Xmn:新生代大小,默认整个堆的3/8
- -XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆到文件
- -XX:+HeapDumpPath:导出OOM的路径
- -XX:OnOutOfMemoryError:在OOM时,执行一个脚本
- -XX:NewRatio:老年代与新生代的比值
- 如果xms=xmx,且设置了xmn的情况下,该参数不用设置
- -XX:SurvivorRatio:Eden区和Survivor区的大小比值
- 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor占整个新生的1/10
- -Xss:通常只有几百K,决定了函数调用的深度
-
元空间的参数
- -XX:MetaspaceSize:初始空间大小
- -XX:MaxMetaspaceSize:最大空间,默认是没有限制的
- -XX:MinMetaspaceFreeRatio:在GC之后,最小的Metaspace剩余空间容量的百分比
- -XX:MaxMetaspaceFreeRatio:在GC之后,最大的Metaspace剩余空间容量的百分比
相关文章:

JVM - 内存分配
目录 JVM的简化架构和运行时数据区 JVM的简化架构 运行时数据区 PC寄存器 Java栈 Java堆 方法区 运行时常量池 本地方法栈 栈、堆、方法区交互关系 Java堆内存模型和分配 Java堆内存概述 Java堆的结构 对象的内存布局 对象的访问定位 Trace跟踪和Java堆的参数配…...

【知识图谱论文】Bi-Link:通过转换器和提示的对比学习桥接来自文本的归纳链接预测
文献题目:Bi-Link: Bridging Inductive Link Predictions from Text via Contrastive Learning of Transformers and Prompts发表期刊:WWW2023代码: https://anonymous.4open.science/r/Bi-Link-2277/. 摘要 归纳知识图的完成需要模型来理解…...

jieba+wordcloud 词云分析 202302 QCon 议题 TOP 关键词
效果图 步骤 (1)依赖 python 库 pip install jieba wordcloud数据 概览 $ head -n 5 input.txt 中国软件技术发展洞察和趋势预测报告 2023 QCon 大会内容策划思路 FinOps:从概念到落地 开源芯片的发展现状、机遇和未来 乐观者前行࿰…...

包管理工具-npm-npx-yarn-cnpm
代码共享方案 在我们通过模块化的方式将代码划分成一个个小的结构后,在以后的开发中我们就可以通过模块化的方式来封装自己的代码,并且封装成一个工具,这个工具我们可以让同事通过导入的方式来使用,甚至你可以分享给世界各地的程…...

go gin学习记录1
环境: MAC M1,Go 1.17.2,GoLand 默认执行指令的终端,如果没有特别说明,指的都是goland->Terminal 创建项目 Goland中新建项目,在$GOPATH/src/目录下建立t_gin项目。 进入项目,在goland的T…...

Docker常用命令
1:帮助命令docker versiondocker infodocker --help2:镜像命令docker images(列出本地主机上的镜像)各个选项说明:docker imagesREPOSITORY:表示镜docker images像的仓库源TAG:镜像的标签IMAGE IDÿ…...

论文写作——公式编辑器、latex表格、颜色搭配器
1、公式编辑器(网页版mathtype可用于latex公式编辑): MathType demo - For DevelopersLive demonstration about the features of Mathtype which allows edition equations and formulas (PNG, flash, SVG, PDF, EPS), based on MathML and compatible with LaTeX.https:/…...

MySQL数据库12——视图(VIEW)
视图概念 视图是一个虚拟表,称其为虚拟表的原因是:视图内的数据并不属于视图本身,而属于创建视图时用到的基本表。可以认为,视图是一个表中的数据经过某种筛选后的显示方式;或者多个表中的数据经过连接筛选后的显示方…...

第四代英特尔至强重磅发布,芯片进入下半场:软硬加速、绿色可持续
编辑 | 宋慧 出品 | CSDN 云计算 2023 年的第二周,英特尔重磅发布其企业级芯片领域重要的产品——第四代英特尔 至强 可扩展处理器。作为数据中心处理器当之无愧的王牌产品,迄今为止,英特尔已经向全球客户交付了超8500万颗至强可扩展处理器…...
c++-运算符函数与运算符重载
目录概述例子注意问题概述 运算符重载是函数一个特殊情况,重载的运算符视为特殊的函数,称为运算符函数。 编译系统能依据使用运算符的不同环境,即参数(操作数)的数量或类型的差异,区分同一运算符的不同含义…...
【MySQL Shell】8.9.3 修复 InnoDB ClusterSet 中的成员服务器和集群
根据集群的问题或维护要求,可以使用以下操作来处理其成员服务器。除非另有说明,否则请使用使用 InnoDB Cluster 管理员帐户或服务器配置帐户获取的 Cluster 和 ClusterSet 对象,以便存储在 ClusterSet 对象中的默认用户帐户具有正确的权限。 …...

宝塔搭建实战php开源likeadmin通用管理pc端nuxt3源码(三)
大家好啊,我是测评君,欢迎来到web测评。 昨天给大家分享了admin前端的搭建部署方式,今天来给大家分享pc端在本地搭建,与打包发布到宝塔的方法,希望能够帮助到大家,感兴趣的朋友可以自行下载学习。 技术架构…...

【C++】---Stack和Queue的用法及其模拟实现
文章目录Stack最小栈栈的弹出压入序列逆波兰表达式求值用栈实现队列模拟实现queue用队列实现栈模拟实现Stack stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...
Python GUI编程
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...

2023年浙江水利水电施工安全员精选真题题库及答案
百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...
Solon2 开发之插件,三、插件体外扩展机制(E-Spi)
插件体外扩展机制,简称:E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如: 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外,方便后续修改 其中, .properties 或 .yml 文件都会做为扩展配置加载&a…...
数据结构与算法(Java版) | 数据结构与算法的关系
从这一节起,咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了,总的来说,第二章要讲解的内容其实也不是特别的多,内容也多偏理论,相信大家学起来是会比较轻松愉快的。 接下来,就请大家跟随…...
华科万维C++章节练习3_7
题目: 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位,以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F], 否则提示“数据输入有误!”)将其转换为对应的摄氏…...

CHAPTER 5 Jenkins SonarQube
Jenkins & SonarQube5.1 安装SonarQube1. 下载镜像2. 导出到其他服务器3. 准备工作4. docker-compose文件5. 启动容器5.2 登录SonarQube1.登录2. 安装中文语言插件3. 安装其他插件5.3 部署扫描器sonar-scanner1. 部署sonar-scanner2. 新建项目3. 扫描代码4. 查看报告5.4 Je…...
[AAAI 2023] Oral : Zero-shot 零样本/ Few-shot 少样本收录论文集合
零样本 (7篇): CALIP: Zero-Shot Enhancement of CLIP with Parameter-free AttentionGuo Ziyu; Zhang Renrui; Qiu Longtian; ma Xianzheng; Miao Xupeng; He Xuming; Cui BinMaximum Entropy Population-Based Training for Zero-Shot Human-AI CoordinationZhao …...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...