jdk8以前



jdk8以后



内存分出的数据区域:程序计数器Java 虚拟机栈本地方法栈方法区运行时常量池字符串常量池

栈:

局部变量表:存放方法参数和方法内定义的局部变量,包括基本数据类型(byte、short、int、long、float、double、char、boolean )以及对象引用。例如在一个方法中定义 int num = 10; ,这个 num 就存储在局部变量表中。

操作数栈 :方法执行过程中,用于存储操作数和运算结果。比如进行 int a = 1 + 2; 运算时,1 和 2 先压入操作数栈,运算后结果 3 也在操作数栈中暂存。

动态链接:Java 虚拟机栈中每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的符号引用,用于支持方法调用过程中的动态链接。

方法返回地址:当方法执行完成后,需要返回调用它的地方,这个地址就存储在此处。

存储内容:是 Java 虚拟机管理的最大一块内存区域,几乎所有的对象实例和数组都在堆上分配内存。例如使用 new 关键字创建对象,如 Object obj = new Object(); ,这个新创建的 Object 实例就存放在堆中。堆也是垃圾回收器主要管理的区域,会根据对象的存活情况进行垃圾回收,释放不再使用的内存空间。

方法区

类信息:包括类的全限定名、父类信息、接口信息、字段信息、方法信息等。比如定义一个 class Person ,这个类的相关结构信息就存储在方法区。

常量:如静态常量,像 public static final int MAX_VALUE = 100; 中的 MAX_VALUE 就存放在方法区。

静态变量 :类中定义的静态变量,如 public static int count = 0; ,count 存储在方法区。

即时编译器编译后的代码:Java 虚拟机的即时编译器(JIT)会将一些热点代码编译成机器码,编译后的代码存放在方法区。 此外,运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。

请简述 Java 的内存模型,以及栈、堆、方法区分别存储什么内容?的更多相关文章

  1. jvm内存模型中-栈,方法区,程序计数器是线程安全的

    文章转自  https://www.cnblogs.com/myna/p/7567889.html 引文 JDK7及之前版本的方法区(Method Area)和Java堆一样,是各个线程共享的内存区域 ...

  2. Java虚拟机内存模型及垃圾回收监控调优

    Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存 ...

  3. java内存管理(堆、栈、方法区)

    java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...

  4. 深入理解Java虚拟机内存模型

    前言 本文中部分内容引用至<深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)>第12章,如果有兴趣可自行深入阅读,文末放有书籍PDF版本连接. 一.物理机中的并发 物理机遇到的并 ...

  5. Java的内存模型

    "让计算机并发执行若干个运算任务"与"更充分地利用计算机处理器的效能"之间的因果关系,看起来顺理成章,实际上它们之间的关系并没有想象中的那么简单,其中一个重要的 ...

  6. Java多线程内存模型

    Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果.在此之前 ...

  7. Java虚拟机--内存模型与线程

    Java虚拟机--内存模型与线程 高速缓存:处理器要与内存交互,如读取.存储运算结果,而计算机的存储设备和处理器的运算速度差异巨大,所以加入一层读写速度和处理器接近的高速缓存来作为内存和处理器之间的缓 ...

  8. JVM 运行时数据区:程序计数器、Java 虚拟机栈和本地方法栈,方法区、堆以及直接内存

    Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数 ...

  9. Java对象内存模型

    2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 在 JVM ...

  10. 全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

随机推荐

  1. Go交叉编译

    #在Mac上编译linux平台应用 GOOS=linux GOARCH=amd64 go build hello.go #在Windows上编译linux平台应用(关闭CGO) CGO_ENABLED ...

  2. springboot 事件监听@EventListener注解用法

    前言 关于@EventListener注解,百度了一下,网上的教程很多都是继承这个,实现那个的,其实根本用不着这么麻烦,所以就写了此文,如文章所讲有误,还请谅解 更多详细用法请百度一下~ 作用 关于事 ...

  3. 1-python中的两大法宝和加载数据

    python中的两大法宝和加载数据 1. Python两大法宝 ① Python3.6.3相当于一个package,package里面有不同的区域,不同的区域有不同的工具. ② Python语法有两大 ...

  4. Java源码分析系列笔记-17.ReentrantReadWriteLock

    目录 1. ReentrantReadWriteLock是什么 2. 非公平ReentrantReadWriteLock 2.1. 是什么 2.2. 怎么使用 2.3. 源码分析 2.3.1. uml ...

  5. Python全栈应用开发利器Dash 3.x新版本介绍(3)

    更多Dash应用开发干货知识.案例,欢迎关注"玩转Dash"微信公众号 大家好我是费老师,在前两期文章中,我们针对Python生态中强大且灵活的全栈应用开发框架Dash,介绍了其3 ...

  6. 从被喷“假开源”到登顶 GitHub 热榜,这个开源项目上演王者归来!

    故事的序幕,在 2024 年 1 月的 GitHub 上悄然拉开. 当时,一个名为 RustFS 的开源项目横空出世,号称要做一个基于 Rust 的企业级分布式存储系统,旨在成为 MinIO 的一个开 ...

  7. layui上传文件choose只触发一次的解决方法

    环境:.net core + layui 场景:上传文件的时候需要先弹出一个层选择对应的条件传到上传方法里面做逻辑,发现layui.upload上传一次之后在不刷新页面的前提下不会执行choose方法 ...

  8. java--bat批处理、对象克隆、反射、观察者,工厂设计模式

    bat批处理文件 bat处理文件就是可以一次性执行多个命令的文件. 如何编写bat处理文件呢? 步骤: 编写一个自定义的文本文件,然后把后缀名改成bat即可, 然后把你所要执行的命令写在bat处理文件 ...

  9. 学习spring cloud记录10-nacos搭建集群

    前言 资源有限,在一台电脑上模拟搭建 搭建 新建数据库 新建nacos数据库,在下载的nacos压缩包中,config目录下有数据表,导入即可 配置nacos 进入nacos/conf目录下,修改cl ...

  10. 迁移学习&在线学习

    简介 英文: transfer learning 以已训练好的模型A为起点,在新场景中,根据新数据建立模型B 目的:将某个领域或任务上学习到的知识或模式,应用到不同但相关的领域或问题中. 特征提取 使 ...