JVM内存结构

JVM-01 JVM内存结构 文章目录1.JVM整体架构1.1 JVM(虚拟机)1.2 Java虚拟机阵营2.JVM子系统构成3.JVM内存结构3.1 名词解释3.2 JVM对该区域规范了两种异常3.3 实例详解Java栈3.4 栈+堆+方法区的交互关系3.5 堆(线程共享)3.5.1 **为什么jdk1.8用元数据区取代了永久代**?3.5.2 java虚拟机调优的目的3.6 JVM执行案例分析3.6.1 编写java类3.... 阅读详情

各个区域对比

区域名称是否线程共享作用特点
堆        线程共享存储所有对象和数组GC 的主要区域,分为新生代(Eden + Survivor)和老年代
方法区线程共享存储类元信息,常量类,静态变量、JIT 编译代码等

JDK 7之前:永久代(PermGen),在堆内存中

JDK8 后由“元空间(Metaspace)”实现,使用本地内存

虚拟机栈线程私有        存储方法调用的栈帧(局部变量、操作数栈、返回地址等)每个方法调用对应一个栈帧,递归太深会 StackOverflowError
本地方法栈线程私有为 Native 方法服务(如 C/C++ 写的 JNI 方法)与虚拟机栈类似,但服务于非 Java 方法
程序计数器线程私有记录当前线程的字节码指令地址,多线程环境下,线程切换后能恢复到正确的执行位置唯一不会OOM的地方

各个区域可能出现的异常

内存区域异常类型触发条件
堆OutOfMemoryError对象实例过多,堆内存不足
方法区OutOfMemoryError加载的类过多,常量池过大
虚拟机栈StackOverflowError递归调用过深,栈帧过多
虚拟机栈OutOfMemoryError创建过多线程,栈内存不足
本地方法栈StackOverflowErrorNative方法递归过深

每个区域的作用:

  • 方法区(线程共享)

存放类的二进制字节码文件(二进制字节码文件中包括:类基本信息,常量池,类方法定义,包含了虚拟机指令);

所有java虚拟机共享的区,存储了和类的结构、类信息

类结构:运行时常量池(含字符串常量),静态变量,类的信息,常量

类信息:魔数,版本号,常量池,类(字段和方法),父类和接口数组,字段,方法等信息。

可以结合类加载器理解:所有上述的信息在Class对象中都可以获取到

方法区逻辑上是堆的一部分,不同厂商在具体实现时不一定,方法区的位置不固定,方法区会产生内存溢出;

方法区是JVM中的一个规范,永久代和元空间是方法区的两个不同实现;

Jdk1.8之前使用永生代实现,1.8之后使用元空间实现。

  • 堆(线程共享)

通过new关键字创建的对象都会由堆存储;堆中不再被引用的对象会通过垃圾回收机制自动回收

细分一点的内存结构:年轻代、老年代;垃圾回收策略也不同。

逻辑上又分为:新生代(Eden、from、to)、老年代

  • jvm栈(线程私有)

线程运行时需要的内存空间;

每个线程只能有一个活动栈帧,对应着一个线程正在执行的那个方法,该栈帧处于栈顶。

一个栈内是由多个栈帧组成的,一个栈帧对应着一个方法的调用,每个栈帧都有自己独立的存储空间

问题辨析:

垃圾回收是否涉及栈内存?

 不涉及,栈帧在每次方法执行完毕会自动排出栈,即被回收。

栈内存分配越大越好吗?

可通过-Xss 改变栈内存分配大小;栈内存分配大了更多的是能够执行的方法更多了,那么相对的能够分配给线程的栈数量就减少了。

方法内的局部变量是否线程安全?

其实就是看变量是共享还是私有的

如果方法内局部变量没有逃离方法的作用访问,即私有的,则是线程安全;

如果局部变量引用了对象,并逃离了方法的作用,需要考虑线程安全

  • 程序计数器(线程私有)

为了线程切换后能恢复到正确的执行位置,每个线程有一个程序计数器,物理上程序计数器是通过寄存器(CPU组件中读取速度最快的单元)来实现的,程序计数器是线程私有的,是java内存中唯一不会存在内存溢出的区

  • 本地栈(线程私有)

本地方法栈的功能特点类似于虚拟机栈,每个线程单独创建自己的本地方法区,主要用于保存本地方法信息。

不同处:虚拟机栈服务的是java方法,本地方法栈服务的是Native方法。

本地方法举例:hashCode,notify,wait

常见参数

堆:‐Xms2048M ‐Xmx2048M

堆-新生代:‐Xmn1024M

栈:‐Xss512K

方法区:‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 

为什么最大与最小值设置成一样的?

参考链接:

JVM内存结构_好久啦的博客-优快云博客_jvm内存结构​​​​​​JVM学习之-JVM内存结构 - 大漠驼铃 - BlogJava

jvm调优技巧 - 内存抖动 、Xms和Xmx参数为什么要设置相同的值_java叶新东老师的博客-优快云博客_xms和xmx为什么要相同

JVM内存结构图解 一 真实系统中的概念   JVM(Java Virtual Machine),顾名思义是对真实计算机系统的模拟,正因如此才能屏蔽物理机器的变化,从而实现“一次编译,到处运行”。   相信很多Java程序员经常听到堆、栈等概念,也会进行设置调优以让Java应用能够更好地运行,但对于JVM与真实计算机系统之间的关系并没有特别清晰的认识。因此,这里先简单介绍下真实计算机系统中的一 阅读详情

相关推荐

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权报错信息11:39:47.976 安装 .hap 到鸿蒙设备 ...11:39:48.517 运行所需的权限没有签名授权,请参考 配置文档11:39:48.517 安装失败。

weixin_66071584的博客 1350

JVM参数调优

任何新的业务系统在上线以前都需要去估算服务器配置和 JVM 的内存参数,这个容量与资源规划并不仅仅是系统架构师的随意估算的,需要根据系统所在业务场景去估算,推断出来一个系统运行模型,评估 JVM 性能和 GC 频率等等指标。以下是我结合大牛经验以及自身实践来总结出来的一个建模步骤:计算业务系统每秒钟创建的对象会佔用多大的内存空间,然后计算集群下的每个系统每秒的内存佔用空间(对象创建速度);设置一个机器配置,估算新生代的空间,比较不同新生代大小之下,多久触发一次 MinorGC;

hannnnn_的博客 349

西威SIEI变频器与电梯主板及驱动板原理图解析与详解(共二十九页原厂PDF图纸)

通过本文的分析,可以了解到西威变频器的技术特点、维修需求以及相关的图纸获取途径。在今后的工作中,维修人员需要充分了解设备的电路图和原理图,掌握正确的维修技术和方法,确保设备的正常运行和延长使用寿命。对于维修人员来说,获取准确的变频器图纸是进行维修工作的基础。这些图纸包含了变频器的电路图、原理图以及相关的元件布局等信息,是维修人员了解设备工作原理、确定维修步骤的重要依据。西威变频器是一种高效、可靠的电机控制设备,广泛应用于电梯、空调、风机等领域的电机控制中。目前,西威提供的维修图纸主要以PDF格式为主。

lXSqtACEzg的博客 1113

JVM参数汇总

垃圾回收器相关: Serial收集器: -XX:+UseSerialGC -XX:+UseSerialOldGC 新生代采用复制算法,老年代采用标记-整理算法。 ParNew收集器: -XX:+UseParNewGC -XX:ParallelGCThreads:指定收集线程数,但是一般不推荐修改。 新生代采用复制算法,老年代采用标记-整理算法。 Parallel Scavenge收集器 -XX:+...

liuyumei3688的专栏 885

先进封装Interposer仿真步骤及说明

摘要: Interposer仿真是2.5D/3DIC封装设计的关键环节,涵盖信号完整性(SI)、电源完整性(PI)、热及结构应力分析。流程分为五个阶段:1)前处理,定义层叠结构与材料属性;2)参数提取,通过3D电磁建模获取TSV、传输线等寄生参数;3)仿真设置,选择求解器并设定频率范围;4)结果分析,评估信号损耗、阻抗及电源网络性能;5)后处理,进行多物理场协同仿真并生成模型。核心挑战在于多尺度与多物理场耦合,需优先确保高速信号与电源网络的仿真精度。常用工具包括Ansys HFSS、Cadence Sigr

DSY_0324的博客 1345

40岁从智驾转具身智能之路

我的工作经历比较复杂,本科毕业后工作2年再次读研的,本科和硕士都是机械专业,硕士毕业后干了5年CAM和机器人再转入到自动驾驶行业。在自动驾驶干了8年,发现自动驾驶已经到了一个瓶颈,再次转行做具身智能。我就谈谈自己的最近这次转型之路。

hzm8341的博客 638

类似-Xms、-Xmn这些参数的含义:

类似-Xms、-Xmn这些参数的含义: 答: 堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。 因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内...

南 墙 9万+

基于SOEM的伺服电机控制实战:从配置到调试

本文详细介绍了基于SOEM的伺服电机控制实战,从硬件配置到软件调试的全过程。通过分享PDO映射、状态机控制、性能优化等核心技巧,帮助开发者快速掌握EtherCAT通信与伺服电机控制的关键技术,提升工控系统开发效率。

weixin_29165465的博客 520

JVM常用的参数汇总

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M

sdkdeveloper的博客 605

2025届程序技术类笔试题

希尔排序在直接插入排序的基础上进行了改进,它通过比较相距一定间隔的元素来进行,各轮比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一轮排序为止。某人逆着水流的方向向岸边划船,每次行进前进x米后需要休息一下,休息期间船会自行倒退y米,每次休息后再次行进,前进距离缩短1/5,若起始距离岸边为m米,问:能否到达岸上,需要行进多少次才能上岸。直接插入排序的原理是将第i个元素插入前面i-1个已排好序的记录中,将比第i个元素大的记录依次向后移动一个位置,将第i个元素插入空位。第二轮相邻比较,后移2次。

博客 594

Airtest进阶使用篇-提高脚本稳定性+批量运行脚本

Airtest进阶篇,主要分享如何提高脚本稳定性+如何批量运行脚本生成测试报告!

程序员小杨哥的博客 2569

JVM内存常用参数配置集合

JVM内存参数配置 Spring Boot程序的JVM参数设置格式(Tomcat启动直接加载bin目录下catalina.sh文件里,注:X越多的,说明越不稳定,可能在后期版本不使用了): java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar 堆配置: ‐Xms:设置初始化java堆的大小 ‐Xmx:

yz_ylfc的博客 700

【AI Agent 记忆共享实战】【下篇】多 Agent 会话 Session 统一共享实战:全链路工程落地、采集归一、MCP 服务、私有化部署、源码级实战

中篇我们已经锁定最终最优架构方案: 非侵入式、外部旁路采集、只读归一、中心化存储、MCP 按需检索注入。摒弃「改 Agent 源码」「软链接互通」「原生 Session 互导」等不现实方案。本篇直接落地可上线、可简历复用、可个人私有化部署多 Agent 异构 Session专属采集器(Claude/CODex/DSH/OpenCode/Kimi/WorkBuddy/ 豆包)统一消息归一化解析层(解决所有 Schema 异构)增量同步、去重、时间戳对齐核心逻辑。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 482

JVM之内存结构详解

对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug。同时,JVM也是面试环节的中重灾区。今天开始,《JVM详解》系列开启,带大家深入了解JVM相关知识。 我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试与工作中“最亮的一颗星”。本系列首发于微信公众号“程序新视界”。下面,开启我们的第一篇文章《JVM之内存结构详解》。 学习也是要讲究方式方法...

程序新视界 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JVM内存结构详解

文章目录一、你了解JVM内存模型吗在这之前需要知道JVM内存模型图——JDK1.81.1、程序计数器1.2、Java虚拟机栈(Stack)1.1.1、java.lang.StackOverflowError问题1.3、本地方法栈1.4、元空间(MetaSpace)1.4.1、MetaSpace相比PermGen的优势1.5、Java堆(Heap)二、JVM三大性能调优参数 -Xms -Xmx -X...

不学习如何码遍天下 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【JVM】内存结构

文章目录JVM-内存结构1.程序计数器1-1 定义1-2 作用1-3 特点2.虚拟机栈2-1 定义2-2 演示2-3 常见问题2-4 栈内存溢出2-5 线程运行诊断3.本地方法栈4.堆4-1 定义4-2 特点4-3 堆内存溢出4-4 堆内存诊断5.方法区5-1 定义5-2 结构5-3 方法区内存溢出5-4 通过反编译来查看类的信息5-5 运行时常量池5-6 常量池与串池StringTable的关系5-7 StringTable 位置5-8 StringTable 垃圾回收5-9 StringTable 性能

小皮皮LL的博客 8055

JVM内存结构概述

本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。 目录 前言 JVM是什么 JVM内存结构概览 运行时数据区 程序计数器 Java虚拟机栈 本地方法栈 方法区 运行时常量池 Java堆 直接内存 前言 JVM是Java中比较难理解和掌握的一部分,也是面试...

没头脑遇到不高兴 5027

JVM 内存结构

本文主要对JVM 内存结构进行讲解,注意不要和Java内存模型混淆了。通过下面两个问题,理解下PC计数器使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。PC寄存器为什么会被设定为线程私有的?

埃泽漫笔 1493

jvm内存结构

jvm内存结构

Zuo_Ci的博客 1375

jvm 内存结构

上面说到,jdk1.8 中,已经不存在永久代(方法区),替代它的一块空间叫做 “ 元空间 ”,和永久代类似,都是 JVM 规范对方法区的实现,但是元空间并不在虚拟机中,而是使用本地内存,元空间的大小仅受本地内存限制,但可以通过 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 来指定元空间的大小。因此,可以这么说,程序计数器是每个线程所私有的。由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,

weixin_62008675的博客 1377

jvm内存结构_聊聊JVM内存结构

起因我们经常会在面试的时候被问到JVM的内存结构,很多人会觉得这东西真的有用吗?也就是面试造火箭,入职拧螺丝。问这个就是纯粹来刁难人的吧。但实际上,我们细想一下。•假设你不知道局部变量实际上属于线程栈中的而非堆里面的,那么你就可能会担心是不是我这样写会有并发问题;•假设你不知道对象实例是分配在堆中,属于JVM共用的,那么你根本也就不会考虑在进行某些访问时进行加锁;•还有很多高并发的问题,...

weixin_39645343的博客 285
上一篇: 类加载以及类加载器
下一篇: java对象的内存分配流程
Learning_foolish
博客等级 码龄9年 14粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值