JVM详解——内存结构
文章目录
- 内存结构
- 1、 运行时数据区
- 2、虚拟机栈
- 3、本地方法栈
- 4、程序计数器
- 5、 堆
- 6、方法区
- 7、运行时常量池
- 8、内存溢出和内存泄漏
- 9、 堆溢出
内存结构
1、 运行时数据区
Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区,不同的区域负责不同的职能,有各自的生命周期,这些区域统称为运行时数据区。
从线程私有和共享的角度区分:
线程私有: 程序计数器、Java虚拟机栈、本地方法栈
线程共享: 堆、方法区
栈是运行时的单位,而堆是存储的单位。
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪。
2、虚拟机栈
作用: 虚拟机栈也称为Java栈,主要管理Java程序的运行,保存方法的局部变量、部分结果,并参与方法的调用和返回。
每个线程都有自己的栈,栈中的数据以栈帧的格式存在,一个线程上正在执行的每个方法都有自己对应的一个栈帧,方法调用栈帧压栈,方法结束栈帧弹出。
栈帧的内部结构
- 局部变量表
主要用于存储方法参数和定义在方法体内的局部变量(包括基本数据类型和对象引用)
- 操作数栈
主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间,在方法执行过程中,根据字节码指令,往操作数栈中写入数据或提取数据,即入栈、出栈
- 动态链接
指向运行时常量池的方法引用
在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在 Class 文件的常量池中,动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用
- 方法返回地址
用来存放调用方法的PC寄存器的值
方法结束的两种方式:正常执行、出现异常,非正常退出
- 一些附加信息
携带与Java虚拟机相关的一些附加信息,比如对程序调试提供支持的信息。
3、本地方法栈
本地方法栈就是Java调用非Java代码的接口,也就是Native Method
本地方法。
作用:与操作系统交互,Java应用有时候需要依赖一些底层系统的支持,比如在拷贝数组时候使用系统拷贝。
4、程序计数器
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器, 存储指向下一条指令的地址,即将执行的指令代码。
作用:CPU在切换线程时,JVM需要明确线程下一条应该执行什么字节码指令,而PC程序计数器中存储的就是下一条指令的地址,并且每个线程的执行进度不同,不同的线程需要有自己的PC程序计数器。
5、 堆
堆是Java虚拟机管理的内存中最大的一块,被所有线程共享。堆用来存放对象实例,几乎所有的对象实例以及数据都在这里分配内存。
堆也是垃圾回收的主要区域,为了高效的进行垃圾回收,虚拟机把堆内存在逻辑上划分为三块区域
- 新生代: 存放新创建的对象和没达到一定年龄的对象
- 老年代: 被长时间使用的对象,老年代内存更大
- 元空间(JDK1.8之前称永久代):存放一些方法中的临时对象
Java 虚拟机规范规定,Java 堆可以是处于物理上不连续的内存空间中,只要逻辑上是连续的即可,像磁盘空间一样。实现时,既可以是固定大小,也可以是可扩展的,主流虚拟机都是可扩展的(通过 -Xmx
和 -Xms
控制),如果堆中没有完成实例分配,并且堆无法再扩展时,就会抛出 OutOfMemoryError
异常。
-Xmx
: 堆的起始内存,默认初始化大小为 电脑内存/64
-Xmx
:堆的最大内存,默认初始化大小为 电脑内存/4
6、方法区
方法区是 JVM 规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,永久代是Hotspot虚拟机对方法区的实现(JDK8之后改为元空间)
JDK8 之前使用永久代实现方法区,容易内存溢出,因为永久代有 -XX:MaxPermSize
上限,即使不设置也有默认大小。JDK7 把放在永久代的字符串常量池、静态变量等移出保存到堆中,JDK8 中取消永久代,改用在本地内存中实现的元空间代替,把 类型信息、字段、方法、常量保存在本地内存的元空间中。
7、运行时常量池
运行时常量池是方法区的一部分,一个有效的class
字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含常量池表,用于存放各种字面量和对类型、域和方法的符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
运行时常量池,相对于 Class 文件常量池的另一个重要特征是动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中。
比如:·String· 类的 intern()
方法,如果字符串常量池中存在对应得字面量,方法返回该字面量得地址;如果不存在,则创建一个对应得字面量放入运行时常量池,返回字面量地址。
8、内存溢出和内存泄漏
内存溢出OutOfMemory
,程序申请的内存超过JVM能够提供的内存大小,导致内存溢出,主要为堆内存溢出。
内存泄漏 Memory Leak
,无法释放已申请的内存,虚拟机不能再次使用该内存
9、 堆溢出
堆用于存储对象实例,只要不断创建对象并保证 GC Roots 到对象有可达路径避免垃圾回收,随着对象数量的增加,程序需要的内存空间就会超出JVM分配的内存空间导致OOM程序崩溃(例如在 while 死循环中一直 new 创建实例)。
出现堆OOM的情况:
- 堆的内存大小设置不当
- 程序中存在内存泄漏问题,或应用中有大量占用内存的对象,并且无法及时释放
解决方案:
-Xms -Xmx
修改堆的内存大小- 通过内存监控软件去查找程序中的泄漏代码
线上排查方式:
- 获取内存的
dump文件
(1. 配置JVM
启动参数,当触发了OOM
异常时自动生成 2. 使用jmap
工具生成) - 使用MAT工具分析
dump文件
- 如果是内存泄漏,可以查看泄漏对象的
GC Roots
的引用链,通过类信息和引用链信息定位到代码位置,进行解决 - 堆空间分配不足以满足业务需求,提升堆内存空间
- 如果是内存泄漏,可以查看泄漏对象的
参考文章:
1. https://pdai.tech/md/java/jvm/java-jvm-struct.html
2. https://blog.csdn.net/weixin_45629285/article/details/128050932
相关文章:
JVM详解——内存结构
文章目录内存结构1、 运行时数据区2、虚拟机栈3、本地方法栈4、程序计数器5、 堆6、方法区7、运行时常量池8、内存溢出和内存泄漏9、 堆溢出内存结构 1、 运行时数据区 Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区,不同的区域负责不同的职能&…...
Jvisualvm监控Tomcat以及相关参数优化
Tomcat阻塞模式 阻塞模式(BIO) 客户端和服务器创建一个连接,它就会创建一个线程来处理这个连接,以为这客户端创建了几个连接,服务端就需要创建几个线程来处理你,导致线程会产生很多,有很多线程…...
界面组件DevExpress WinForms v22.2 - 全面升级数据展示功能
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...
正点原子第一期
ZYNQ是一个fpga用来硬件编程,外加一个软件编程 FPGA是可通过编程来修改其逻辑功能的数字集成电路 第三篇语法篇 第七章 verilog HDL语法 Verilog的简介 可编程逻辑电路:允许用户自行修改内部连接的集成电路,其内部的电路结构可以通过编程数…...
「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC
「mysql是怎样运行的」第24章 一条记录的多幅面孔—事务的隔离级别与MVCC 文章目录「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC一、事前准备二、事务的隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别三、MVCC原…...
入门Java第十五天 线程
一、多线程 1.1进程和线程 进程:进程就是操作系统中运行的每一个应用程序。例如:微信,QQ 线程:线程是进程中的每一个任务。 多线程:在一个进程中,可以同时执行多个线程。同时完成多个任务。 并发&#x…...
探索用卷积神经网络实现MNIST数据集分类
问题对比单个全连接网络,在卷积神经网络层的加持下,初始时,整个神经网络模型的性能是否会更好。方法模型设计两层卷积神经网络(包含池化层),一层全连接网络。选择 5 x 5 的卷积核,输入通道为 1&…...
MySQL 索引失效场景
1,前言 索引主要是为了提高表的查询速率,但在某些情况下,索引也会失效的情况。 2,失效场景 2.1 最左前缀法则 查询从索引最左列开始,如果跳过索引中的age列,那么age后面字段的索引都将失效,…...
Xcode开发工具,图片放入ios工程
Xcode开发工具,图片放入ios工程,有三种方式: 一:Assets Assets.xcassets 一般是以蓝色的Assets.xcassets的文件夹形式在工程中,以Image Set的形式管理。当一组图片放入的时候同时会生成描述文件Contents.jso…...
操作系统权限提升(十九)之Linux提权-SUID提权
系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该…...
直播 | StarRocks 实战系列第三期--StarRocks 运维的那些事
2023 年开春, StarRocks 社区重磅推出入门级实战系列直播,手把手带你从 Zero to Hero 成为一个 “StarRocks Pro”!通过实际操作和应用场景的结合,我们将帮你系统性地学习 StarRocks 这个当今最热门的开源 OLAP 数据库。本次&…...
KingabseES执行计划-分区剪枝(partition pruning)
概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 。在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区。此功能使数据库只能在与SQL语句相关的分区上执行操作。 参数 enable_partition_pruning 设…...
Operator-sdk 在 KaiwuDB 容器云中的使用
一、使用背景KaiwuDB Operator 是一个自动运维部署工具,可以在 Kubernetes 环境上部署 KaiwuDB集群,借助 Operator 可实现无缝运行在公有云厂商提供的 Kubernetes 平台上,让 KaiwuDB 成为真正的 Cloud-Native 数据库。使用传统的自动化工具会…...
【数据挖掘】2、数据预处理
文章目录一、数据预处理的意义1.1 缺失数据1.1.1 原因1.1.2 方案1.1.3 离群点分析1.2 重复数据1.2.1 原因1.2.2 去重的方案1.3 数据转换1.4 数据描述二、数据预处理方法2.1 特征选择 Feature Selection2.2 特征提取 Feature Extraction2.2.1 PCA 主成分分析2.2.2 LDA 线性判别分…...
(四十六)大白话在数据库里,哪些操作会导致在表级别加锁呢?
之前我们已经给大家讲解了数据库里的行锁的概念,其实还是比较简单,容易理解的,因为在讲解锁这个概念之前,对于多事务并发以及隔离,我们已经深入讲解过了,所以大家应该很容易在脑子里有一个多事务并发执行的…...
【Android源码面试宝典】MMKV从使用到原理分析(二)
上一章节,我们从使用入手,进行了MMKV的简单讲解,我们通过分析简单的运行时日志,从中大概猜到了一些MMKV的代码内部流程,同时,我们也提出了若干的疑问?还是那句话,带着目标(问题)去阅读一篇源码,那么往往收获的知识,更加深入&扎实。 本节,我们一起来从源码层次…...
如何使用ADFSRelay分析和研究针对ADFS的NTLM中继攻击
关于ADFSRelay ADFSRelay是一款功能强大的概念验证工具,可以帮助广大研究人员分析和研究针对ADFS的NTLM中继攻击。 ADFSRelay这款工具由NTLMParse和ADFSRelay这两个实用程序组成。其中,NTLMParse用于解码base64编码的NTLM消息,并打印有关消…...
【Python学习笔记】第二十二节 Python XML 解析
一、什么是XMLXML即ExtentsibleMarkup Language(可扩展标记语言),是用来定义其它语言的一种元语言。XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则,它没有标签集(tagset),也没有语法规则(grammatical rule)。任何XML文档对任何…...
5分钟轻松拿下Java枚举
文章目录一、枚举(Enum)1.1 枚举概述1.2 定义枚举类型1.2.1 静态常量案例1.2.2 枚举案例1.2.3 枚举与switch1.3 枚举的用法1.3.1 枚举类的成员1.3.2 枚举类的构造方法1)枚举的无参构造方法2)枚举的有参构造方法1.3.3 枚举中的抽象方法1.4 Enum 类1.4.1 E…...
华为OD机试【独家】提供C语言题解 - 最小传递延迟
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明最小…...
【Web前端】关于JS数组方法的一些理解
一、具备栈特性的方法unshift(...items: T[]) : number将一个或多个元素添加到数组的开头,并返回该数组的新长度。shift(): T | undefined从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。二、具备队列特性的方法push(...items: T[]): …...
多智能体集群协同控制笔记(1):线性无领航多智能体系统的一致性
对于连续时间高阶线性多智能体系统的状态方程为: x˙i(t)Axi(t)Bui(t),i1,2..N\dot {\mathbf{x}}_i(t)A\mathbf{x}_i(t)B\mathbf{u}_i(t),i1,2..N x˙i(t)Axi(t)Bui(t),i1,2..N 下标iii代表第iii个智能体,ui(t)∈Rq1\mathbf{u}_i(t)\in R^{q \time…...
hadoop-Yarn资源调度器【尚硅谷】
大数据学习笔记 Yarn资源调度器 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行与操作系统之上的应用程序。 (也就是负责MapTask、ReduceTask等任…...
聊聊如何避免多个jar通过maven打包成一个jar,多个同名配置文件发生覆盖问题
前言 不知道大家在开发的过程中,有没有遇到这种场景,外部的项目想访问内部nexus私仓的jar,因为私仓不对外开放,导致外部的项目没法下载到私仓的jar,导致项目因缺少jar而无法运行。 通常遇到这种场景,常用…...
Flume 使用小案例
案例一:采集文件内容上传到HDFS 1)把Agent的配置保存到flume的conf目录下的 file-to-hdfs.conf 文件中 # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1 # Describe/configure the source a1.sources.r1.type spoo…...
DLO-SLAM代码阅读
文章目录DLO-SLAM点评代码解析OdomNode代码结构主函数 main激光回调函数 icpCB初始化 initializeDLO重力对齐 gravityAlign点云预处理 preprocessPoints关键帧指标 computeMetrics设定关键帧阈值setAdaptiveParams初始化目标数据 initializeInputTarget设置源数据 setInputSour…...
X和Ku波段小尺寸无线电设计
卫星通信、雷达和信号情报(SIGINT)领域的许多航空航天和防务电子系统早就要求使用一部分或全部X和Ku频段。随着这些应用转向更加便携的平台,如无人机(UAV)和手持式无线电等,开发在X和Ku波段工作,同时仍然保持极高性能水平的新型小尺寸、低功耗…...
推荐算法 - 汇总
本文主要对推荐算法整体知识点做汇总,做到总体的理解;深入理解需要再看专业的材料。推荐算法的意义推荐根据用户兴趣和行为特点,向用户推荐所需的信息或商品,帮助用户在海量信息中快速发现真正所需的商品,提高用户黏性…...
Android 系统的启动流程
前言:从开机的那一刻,到开机完成后launcher将所有应用进行图标展示的这个过程,大概会有哪一些操作?执行了哪些代码?作为Android开发工程师的我们,有必要好好的梳理一遍。既然要梳理Android系统的启动流程&a…...
自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分
我的学习心得,我认为能不能自学成功的要素有两点。 第一点就是自身的问题,虽然想要转行学习Java的人很多,但是非常强烈的想要转行学好的人是小部分。而大部分人只是抱着试试的心态来学习Java,这是完全不可能的。所以能不能学成Jav…...
炫酷的电商网站设计/在线网络培训平台
树状数组的问题模型 首先我们搞明白树状数组是用来干嘛的,现在有一个这样的问题:有一个数组a,下标从0到n-1,现在给你w次修改,q次查询,修改的话是修改数组中某一个元素的值;查询的话是查询数组中…...
做婚庆网站图片下载/如何建立网站的步骤
文章讲的是融资良久,神策数据对未来有何展望,11月4日至6日,神策数据在北京中国地质大学举办了神策数据驱动大会,即便雾霾严重,众多合作企业以及众多企业的数据分析师、产品经理、运营总监等还是纷纷来到了现场。 神策数…...
青岛制作企业网站/长春seo顾问
1.配置httpd.conf 监听多个端口 #Listen 12.34.56.78:80 Listen 8081 Listen 8082 Listen 8083 可以通过netstat -n -a查看端口是否开启 2.开启虚拟站点 # Virtual hosts #Include conf/extra/httpd-vhosts.conf #修改为 # Virtual hosts Include conf/extra/httpd-vhosts.con…...
我公司是做网站开发的怎么纳税/seo收录排名
在上篇随笔中对于客户实例传递的xml实现中,手动定义了xml的数据格式,如果现在对产品实例进行传递,那么还要手动对产品实例进行xml进行数据格式化。现在有一套为数据传递定义的协议,那就是soap。其实html也是一种数据存储格式&…...
学网页设计报班/浑江区关键词seo排名优化
创建云上的数据恢复计划,很重要的一点是持续跟踪基础架构,DR需求和可能的故障转移持续时间。 公有云给IT部门提供了绝佳的机会来实现业务的持续性/灾难恢复计划,而无需花费巨资构建独享的数据中心。有了云数据恢复系统之后,云就可…...
无极招工招聘信息/娄底地seo
大家可能都有类似的经历,去医院看个小感冒也会花个五六百块钱,医疗花费透明性一直都是个问题,Castlight的出现就是为了解决这个问题,近日宣布获得1亿美元D轮融资,这是医疗技术公司有史以来获得的最大一笔融资ÿ…...