JVM 内存模型

JVM 内存模型与 JMM 内存模型 JVM 内存模型JMM(Java 内存模型)物理内存如何划分逻辑上如何安全访问共享数据关注内存分配和回收关注线程间通信和数据同步解决内存溢出、栈溢出问题解决竞态条件、内存可见性问题一句话总结:JVM 内存模型是“内存怎么用”,JMM是“多线程怎么安全地用内存”。 阅读详情

JVM 内存模型

JMM

1. 堆

各线程共享的内存区域,在JVM启动时创建,是JVM内存中最大的一块区域。存放对象的实例(对象本身,该对象的引用存在栈中)和数组,由GC进行垃圾处理回收,堆内存的大小可以通过参数-xmx(最大值)和-xms(初始值)进行设置。
Java堆是垃圾收集器主要管理的区域,因此也被称为“GC堆”。目前收集器基本都采用“分代收集”算法,所以Java堆中还可以细分为:新生代和老年代。新生代又可以区分为:Eden空间,Form Survivor空间和To Survivor空间。关于堆中区域分配、垃圾回收机制等,之后文章回细说。
堆中可能抛出的异常:
OutOfMemoryError:如果在堆中没有内存完成实例分配,并且堆也无法继续再扩展时,就会抛出该异常。

2. 方法区

各线程共享的内存区域,存储虚拟机加载的类的信息(类名称、方法信息、字段信息)、常量、静态变量、即时编译器编译后的代码等数据。
被划分为两个主要的区域:持久代和代码缓存
1.持久代:存储包括类定义,结构,字段,方法(数据和代码)以及常量在内的类相关数据,它可以通过-XX:PermSize及-XX:MaxPermSize来进行调节。如果它的空间用完了,会导致java.lang.OutOfMemoryError: PermGen space的异常。
2.代码缓存:用来存取编译后的代码。

3. 虚拟机栈(线程私有)

生命周期与线程相同,创建线程的时候就会创建一个java虚拟机栈。每个方法在执行时会创建一个栈帧,栈帧中存放局部变量表(基本数据类型和对象的引用)、操作数栈、指向运行时常量池的引用、方法的返回地址等信息,每个方法被调用到执行完毕的过程,对应一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表:存放了编译时期可知的各种基本数据类型(byte,short,int,long,float,dubbo,boolean,char),对象引用(reference类型,可能是一个指向对象起始地址的引用指针,也有可能是指向一个代表对象的句柄或其他与该对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)
虚拟机栈中可能抛出的两种异常:
1.StackOverflowError:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出该异常。
2.OutOfMemoryError:如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存,就会抛出该异常。

4. 本地方法栈(线程私有)

线程私有,与虚拟机栈相似,不过这个是为虚拟机使用到的native方法服务。会抛出StackOverflowError和OutOfMemoryError异常。具体抛出异常原因,同虚拟机栈

5. 程序计数器/PC寄存器(线程私有)

生命周期与线程相同。记载每一个线程当前运行的JAVA方法的地址。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器。程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。

6. 运行时常量池

运行时常量池是方法区的一部分。class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放进方法区中的运行时常量池中。
运行时常量池中可能抛出的异常:
OutOfMemoryError:因为运行时常量池是堆的一部分,所以也受到方法区内存大小的限制,当长两次无法再申请到内存时就会抛出该异常。

AI游戏制作07——波次计时器,敌人按波次生成 阅读详情

相关推荐

Carsim与AVL CRUISE联合仿真:从零搭建整车模型的实战指南

本文详细介绍了如何从零开始搭建Carsim与AVL CRUISE联合仿真整车模型,涵盖软件环境配置、接口设置、模型连接及调试技巧。通过联合仿真,可充分发挥Carsim在车辆动力学和AVL CRUISE在动力系统仿真方面的优势,为电动车和混合动力汽车的研发提供精准的整车模型分析。

weixin_29067143的博客 940

JVM内存模型

Java在诞生之初就提出了"Write once,Run Anywhere"的口号,而这些都得益于JVM(Java Vritual Machine),可以提前在不同的运行环境(linux或windows等)上安装JDK之后,就可以让同一份代码在任何地方运行了。而这里的JDK(Java Development Kit)是Java语言、Java虚拟机和Java类库的统称。 一、JDK体系结构与Java跨平台特性 1.1 JDK体系结构 JDK是一个非常庞大的体系,里面包含了JVM、Java SE API(核心类

sermonlizhi的博客 1万+

c++11 无锁队列

/************************************************************************* > File Name: lockfreequeue.cpp > Author: > Mail: > Created Time: Wed 08 Aug 2018 11:38:08 AM CST ********...

qq_35728402的博客 5024

Jvm 的内存模型

本地内存是所有线程都共享的一部分内存,

Edwin_Hu的博客 1150

磁编码器选型避坑指南:为什么MT6816比霍尔传感器更适合你的伺服系统?

本文深入对比了MT6816磁编码器与传统霍尔传感器在伺服系统中的应用。MT6816基于AMR技术,对磁场方向敏感而非强度,具备高精度、强抗干扰、高安装容差和极低延时等优势,尤其适合高转速、恶劣环境下的工业场景,能有效提升系统可靠性与长期稳定性。

rainy的博客 1104

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3705

jvm 内存模型

堆内存(Heap Memory)方法区(Method Area)栈内存(Stack Memory)程序计数器(Program Counter Register)本地方法栈(Native Method Stack)这些区域各自承担着不同的任务,共同保障Java程序的顺利执行。堆内存是JVM中最大的一块内存区域,用于存储对象实例和数组。所有的对象实例都在堆内存中分配,并由垃圾回收机制(GC)自动管理其生命周期。堆内存是所有线程共享的区域,因此它也是并发编程中可能出现线程安全问题的地方。

Flying_Fish_roe的博客 1478

DDR内存接口深度解析:从寻址机制到FPGA时序约束实战

在高速数字系统设计中,内存接口是决定系统性能与稳定性的关键。DDR(双倍数据速率)技术通过在时钟的上升沿和下降沿传输数据,实现了带宽的倍增,广泛应用于消费电子、通信设备和工控主板等领域。其核心原理在于利用三维存储阵列(Bank、Row、Column)的分级寻址机制,通过先进行行激活、再进行列访问的固定时序,实现高速数据吞吐。理解这一寻址顺序是进行精准时序分析的基础。在工程实践中,FPGA作为内存控制器,需通过严谨的时序约束(如set_input_delay)来确保信号在高速传输下的建立与保持时间要求,从而将

weixin_29192211的博客 197

「 JVM 」不容忽视的细节:JVM内存模型和Java内存模型

在 Java 中,JVM 内存模型(JVM Memory Model)和Java 内存模型(Java Memory Model, JMM)都是关于内存的关键概念,但它们处于不同层级,解决的问题也不同。JVM 内存模型关注的是运行时的内存结构,将内存划分为方法区、堆、程序计数器、虚拟机栈和本地方法栈。这些内存区域在 JVM 中具有特定的用途,比如方法区存储类信息和常量,堆则是对象实例的主要存放区。程序计数器用于跟踪当前线程的执行进度,虚拟机栈和本地方法栈则用来维护每个线程的方法调用状态和本地方法信息。

frozenpenguin的博客 2729

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1788

ros入门(八)---TF坐标转换

TF(TransForm),就是坐标转换,包括了位置和姿态两个方面的变换。

weixin_51157015的博客 3389

关于JVM内存模型的理解

一、概念 1、JVM内存模型 首先老规矩,祭上一张自己画的内存模型图 画的比较简陋,简单介绍一下,整个JVM占用的内存可分为两个大区,分别是线程共享区和线程私有区,线程共享区和JVM同生共死,所有线程均可访问此区域;而线程私有区顾名思义每个线程各自占有,与各自线程同生共死。这两个大区内部根据JVM规范定义又分为以下几个区: 方法区(Method Area) 方法区主要是放一下...

菜头君的博客 1万+

PICO640红外探测器配置模块verilog

Ulis pico 640红外探测器配置模块

Go Forward Forever! 2033

【JVM】JVM内存模型详解

JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够“一次编译,到处运行的”原因。方法区存储的内容有:类型信息(比如类全称、父类全称)、域信息(域名称、域修饰符private等)、方法信息(方法名称、方法修饰符、返回类型等)、字面量(字面量包括文本字符串、八种基本类型的值 、被声明为final的常量等)。Java虚拟机栈是当前线程在执行方法时存储所需的数据、指令、返回地址的一种栈结构(先进后出)。

Money、坤的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Jvm 内存模型

一、内存模型 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JWM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JM的高效稳定运行。不同的JM对于内存的划分方式和管理机制存在着部分差异。 程序计数器 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方.

three_stand的博客 5541

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【JVM】内存模型

在前面的学习中,我们知道了字节码文件()会通过类加载器加载到虚拟机中,接下来虚拟机就会执行其中的字节码指令.我们把虚拟机被分配的内存叫做运行时数据区域 而内存模型就是指运行时数据区域中被划分的不同区域. 版本: 字符串常量池存放在方法区中,方法区存放在堆中; 版本: 方法区脱离堆,单独占用一部分内存字符串常量池依旧存储在堆中 版本: 方法区发生移动,从虚拟机内存中,移动到本地内存中虚拟机()的内存模型是程序运行时内存管理的基础。它定义了程序如何在内存中分配、使用和回收资源。 保存在中实现的方法 采用栈的数据

2301_78320637的博客 4548

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JVM内存模型与Java内存模型

博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主。

激流丶的博客 2460

Java内存模型与Jvm内存模型

经典问题 Q:说一下 Java(Jvm)的内存模型 A:Java内存模型是Jvm内存模型的抽象(深入理解JAVA虚拟机) JVM内存模型 线程安全--虚拟机栈、本地方法栈、程序计数器 非线程安全--方法区、堆(新生代,老年代)、 Meta Space(Jdk 1.8新增) Java内存模型 工作内存、主内存(对应JVM内存中的一部分) 追根溯源 Jvm内存模型 Java虚拟机运行时数据区 程序计数器:一块较小的内存空间,当前

chzh101011的博客 2746

聊聊JVM的内存模型

JVM内存模型定义了Java程序运行时的内存组织结构和管理机制。它不仅是内存分配的基础,更是程序执行、垃圾回收、多线程并发的基石。这里需要分清一个点,JVM和JMM(Java内存模型)是两个完全不同的概念Java内存模型(JMM):Java语言层面的内存模型,关注多线程环境下的内存可见性、原子性、有序性JVM内存结构(运行时数据区):JVM进程在执行Java程序时的内存布局和管理机制1.分层设计:线程私有与共享区域分离,平衡性能与安全性2.分代管理:基于对象生命周期优化垃圾回收3.自动管理。

gdpu2400502251的博客 1365

JAVA内存模型与JVM内存模型的区别

** JAVA内存模型与JVM内存模型的区别 ** 直接进入正题 **JAVA内存模型: Java内存模型规定所有的变量都是存在主存中,每个线程都有自己的工作内存。线程堆变量的操作都必须在工作内存进行,不能直接堆主存进行操作,并且每个线程不能访问其他线程的工作内存。 Java内存模型的Volatile关键字,原子性、可见性、有序性 详情 *...

qq_37019196的博客 1万+

JVM内存模型解析

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1706

jvm内存模型和java内存模型

初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、...

番茄炒土豆的博客 9445
上一篇: 搭建一个Dubbo
下一篇: 元空间
万事胜意❀
博客等级 码龄9年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值