Java内存区域详解(程序计数器、Java 虚拟机栈、本地方法栈、堆、方法区、运行时常量池、直接内存)

深入理解JVM--Java内存区域之栈,堆,方法区 介绍 最近开始学习JVM,及时整理一下,Java虚拟机在执行Java程序的过程中会把其管理的内存分为若干个不同的数据区域。 1、程序计数器(线程私有) 程序计数器是一块较小的内存空间,他可以看作是当前线程所执行的字节码的行号指示器。如果正在执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,计数器值为空。此内存区域没有OutOfMemoryEr... 阅读详情

前言

❝ 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
❞

运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

1.jpg

「线程私有的」:

1. 程序计数器
2. 虚拟机栈
3. 本地方法栈

「线程共享的」:

1. 堆
2. 方法区

直接内存 (非运行时数据区的一部分)

1.程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。「字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。」

「另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。」

从上面的介绍中我们知道**「程序计数器主要有两个作用:」**

  • 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
  • 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。

「注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。」

2.Java 虚拟机栈

「与程序计数器一样,Java 虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。」

「Java 内存可以粗糙的区分为堆内存(Heap)和内存(Stack),其中栈就是现在说的虚拟机栈,或者说是虚拟机栈中局部变量表部分。」 (实际上,Java 虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。)

「局部变量表主要存放了编译期可知的各种数据类型」(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。

「Java 虚拟机栈会出现两种错误」:StackOverFlowError和OutOfMemoryError。

  • StackOverFlowError: 若 Java 虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,就抛出StackOverFlowError 错误。
  • OutOfMemoryError: 若 Java 虚拟机堆中没有空闲内存,并且垃圾回收器也无法提供更多内存的话。就会抛出 OutOfMemoryError 错误。 Java 虚拟机栈也是线程私有的,每个线程都有各自的 Java 虚拟机栈,而且随着线程的创建而创建,随着线程的死亡而死亡。

「扩展:那么方法/函数如何调用?」

Java 栈可用类比数据结构中栈,Java 栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入 Java 栈,每一个函数调用结束后,都会有一个栈帧被弹出。

Java 方法有两种返回方式:

1. return 语句。
2. 抛出异常。

不管哪种返回方式都会导致栈帧被弹出。

3. 本地方法栈

和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。

方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError和 OutOfMemoryError两种错误。

4.堆

Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。「此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。」

「Java世界中“几乎”所有的对象都在堆中分配,但是,随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。从jdk 1.7开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。」

Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 「堆」(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor空间等。「进一步划分的目的是更好地回收内存,或者更快地分配内存。」

在 JDK 7 版本及JDK 7 版本之前,堆内存被通常被分为下面三部分:

  1. 新生代内存(Young Generation)
  2. 老生代(Old Generation)
  3. 永生代(Permanent Generation)

2.jpg

JDK 8 版本之后方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是直接内存。

3.jpg

「上图所示的 Eden 区、两个 Survivor 区都属于新生代(为了区分,这两个 Survivor 区域按照顺序被命名为 from 和 to),中间一层属于老年代。」

大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

修正(issue552):“Hotspot遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值”。

动态年龄计算的代码如下

uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
 //survivor_capacity是survivor空间的大小
  size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
  size_t total = 0;
  uint age = 1;
  while (age < table_size) {
    total += sizes[age];//sizes数组是每个年龄段对象大小
    if (total > desired_survivor_size) break;
    age++;
  }
  uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
 ...
}

堆这里最容易出现的就是 OutOfMemoryError 错误,并且出现这种错误之后的表现形式还会有几种,比如:

  1. OutOfMemoryError: GC Overhead Limit Exceeded: 当JVM花太多时间执行垃圾回收并且只能回收很少的堆空间时,就会发生此错误。
  2. java.lang.OutOfMemoryError: Java heap space :假如在创建新的对象时, 堆内存中的空间不足以存放新创建的对象, 就会引发java.lang.OutOfMemoryError: Java heap space错误。(和本机物理内存无关,和你配置的内存大小有关!)
  3. …

5.方法区

方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

方法区也被称为永久代。很多人都会分不清方法区和永久代的关系,为此我也查阅了文献。

(1) 方法区和永久代的关系

❝ 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 方法区和永久代的关系很像 Java 中接口和类的关系,类实现了接口,而永久代就是 HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式。 也就是说,永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久代这一说法。
❞

(2 )常用参数

JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参数来调节方法区大小

-XX:PermSize=N //方法区 (永久代) 初始大小
-XX:MaxPermSize=N //方法区 (永久代) 最大大小,超过这个值将会抛出 OutOfMemoryError 异常:java.lang.OutOfMemoryError: PermGen

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。

JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是直接内存。

下面是一些常用参数:

-XX:MetaspaceSize=N //设置 Metaspace 的初始(和最小大小)
-XX:MaxMetaspaceSize=N //设置 Metaspace 的最大大小

与永久代很大的不同就是,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。

(3 )为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢?

1. 整个永久代有一个 JVM 本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。

当你元空间溢出时会得到如下错误: java.lang.OutOfMemoryError: MetaSpace

你可以使用 -XX:MaxMetaspaceSize标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。-XX:MetaspaceSize 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace将根据运行时的应用程序需求动态地重新调整大小。

元空间里面存放的是类的元数据,这样加载多少类的元数据就不由 MaxPermSize控制了, 而由系统的实际可用空间来控制,这样能加载的类就更多了。

在 JDK8,合并 HotSpot和 JRockit的代码时, JRockit 从来没有一个叫永久代的东西, 合并之后就没有必要额外的设置这么一个永久代的地方了。

6.运行时常量池

运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池表(用于存放编译期生成的各种字面量和符号引用)

既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 错误。

JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。

修正(issue747,reference):

  1. JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代
  2. JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代 。
  3. JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) 相关问题:JVM 常量池中存储的是对象还是引用呢?

7.直接内存

「直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 错误出现。」

JDK1.4 中新加入的NIO(New Input/Output) 类,引入了一种基于「通道(Channel)」 与「缓存区(Buffer)」 的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为「避免了在 Java 堆和 Native 堆之间来回复制数据。」

本机直接内存的分配不会受到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。

Java代码执行过程

4.jpg

汇编语言,机器语言,高级语言关系

5.jpg

JVM的架构模型

6.jpg

JVM生命周期

7.jpg

「参考」:

《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第三版》 《实战 java 虚拟机》

java-内存管理(程序计数器、虚拟机栈、本地方法栈、堆、方法区)和常量池 Java内存管理:深入Java内存区域1. 运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,创建以及销毁时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 阅读详情

相关推荐

非标准包 game.rgss3a 的打开方法 | 2023 年实测

生活笔记

陌雨’的博客 1万+

【最详细】最新最全Java虚拟机(JVM)面试题(51道)

【最详细】最新最全Java虚拟机(JVM)面试题(51道)

wufaqidong1的博客 488

libnice和coturn这两个库有交叉实现的地方,具体有啥区别?

TurnAdmin:是一个TURN的管理工具,此工具能被用来管理用户账号的增删改查。 TurnServer:是TURN和STUN的服务器实现。 Turnutils_uclient: 模拟多个UDP、TCP、TLS或DTLS客户端 Turnutils_peer: 一个简单的无状态UDP-ECHO服务器,用作中继模式中的最终服务器 Turnutils_stunclient: 一个简单的STUN客户端例子 Turnutils_rfc5769check: 检查STUN/TURN协议实现的正确性。 我们..

Langeldep的专栏 1320

JVM中哪些是线程共享区和线程私有区

如果当前线程正在执行本地方法(Native Method),程序计数器的值为空(Undefined)。JVM 中的线程私有区包括程序计数器、虚拟机栈和本地方法栈,用于存储线程私有的数据和方法调用信息。是每个线程独立拥有的内存区域,用于存储线程私有的数据。如果当前线程正在执行 Java 方法,程序计数器存储的是虚拟机字节码指令的地址。程序计数器是线程私有的,每个线程都有自己的程序计数器。本地方法栈是线程私有的,每个线程都有自己的本地方法栈。虚拟机栈是线程私有的,每个线程都有自己的虚拟机栈。

完全体 1178

Python爬虫实战:从巨潮网批量抓取上市公司年报JSON数据

网络爬虫作为自动化数据采集的核心技术,其原理是通过模拟浏览器行为向服务器发送HTTP请求并解析响应,从而高效获取结构化信息。在金融数据分析领域,这项技术价值尤为突出,能够将研究人员从繁琐的手工数据收集中解放出来,聚焦于更高阶的模型构建与价值挖掘。典型的应用场景包括上市公司财务研究、市场趋势分析和风险预警系统开发。本文以Python的requests库为核心工具,详细解析如何通过分析巨潮资讯网的JSON数据接口,构建一个稳定、高效的上市公司年报数据采集管道,并重点探讨了接口逆向、分页爬取、PDF文件下载等关键

weixin_42529366的博客 1239

使用cubeMX生成USB HID设备

本文主要介绍如何使用stm32开发板和cubeMX生成HID设备,供参考。

专注音频,高效工作,快乐生活! 971

Java内存区域

了解Java内存区域的奥秘!就像我们的大脑有不同区域记忆不同信息一样,计算机也有内存区域。栈像一摞盘子,存放着程序运行时的小数据。堆是个大仓库,装载较大的数据,比如我们创建的对象。方法区就像图书馆,存储程序的结构和信息。程序计数器就像书中的页码,帮助计算机记住当前执行位置

ezerror的栈力补给 476

Gartner《构建可扩展数据产品建设框架》心得

数据产品化:从概念到落地的实践指南 当前企业正从传统数据需求模式转向数据产品化新范式。本文系统阐述了数据产品的核心价值、定义分类和实施框架,指出成功关键是将数据包装为可复用、可扩展的产品。Gartner框架强调产品思维,提出4阶段12步实施路径,涵盖设计、工程、发布和监控全流程。文章特别提醒要避免7大常见误区,如简单重命名报表、忽视元数据治理等,建议采取MVP策略,90天内完成从价值验证到产品落地的闭环。实施中需平衡技术选型与业务需求,建立跨职能团队,并通过AARRR模型持续追踪产品价值。

2501_91410404的博客 1007

java 中的堆和栈

其他的内容都可以按照路线图里面整理出来的知识点逐一去熟悉,学习,消化,不建议你去看书学习,最好是多看一些视频,把不懂地方反复看,学习了一节视频内容第二天一定要去复习,并总结成思维导图,形成树状知识网络结构,方便日后复习。这里还有一份很不错的《Java基础核心总结笔记》,特意跟大家分享出来目录:部分内容截图:《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!外链图片转存中…(img-IV6bNNYd-1711976072551)]

2401_83816794的博客 900

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号-串联端接

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑并且进行串联端接,以下图为例,准备好发送接收端的IBIS模型, (se_example.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(W1_welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 339

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2218

JVM内存结构 —— 运行时数据区

首先需要明白的是 Java内存模型和JVM内存结构不是一个概念,在面试时要搞清楚面试官问的到底是什么。 Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程运行所设计的内存空间 常说的 JVM 内存结构指的就是运行时数据区,其中堆、方法区被线程共享,程序计数器、虚拟机栈、本地方法栈被线程独享。 一、 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计

嗷嗷嗷嗷的博客 230

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1551

深入解析Java内存区域

Java内存区域 众所周知,Java虚拟机有自动内存管理机制,在这个机制下,我们不再 不需要像C++/C程序开发员这样为每一个new操作去写其对应的delete/free操作,这样就不容易出现内存泄漏和溢出2方面的问题。因为我们把内存控制权力交给了虚拟机,如果出现内存泄漏和溢出方面的问题,排查错误就必须要了解虚拟机内部是怎样使用内存的。 下图是JDK8之后的JVM内存布局。 (引自https://www.cnblogs.com/czwbig/p/11127124.html) 1、私有or共享? 按线程是

weixin_45759791的博客 795

IDEA的使用指南

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM内存模型程序计数器、虚拟机栈、本地方法栈、堆、方法区、运行时常量池、直接内存

java内存虚拟机主要分为程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(方法区/运行时常量池)5大部分。1.程序计数器(Program Counter Register)    他记录了程序执行的字节码的行号和指令,字节码解释器工作时就是通过改变计数器值来选择下一个要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等。    由于java虚拟机多线程是通过线程轮流切换CPU时...

wangaz521的博客 3522

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java内存区域详解(程序计数器、Java-虚拟机栈、本地方法栈、堆)

JDK1.4 中新加入的。

erghtt的博客 1061

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

堆、方法区、虚拟机栈、本地方法栈 和 程序计数器

Java 内存区域的设计是为了支持高效的程序执行和内存管理。理解这些内存区域的作用和特点,有助于编写高性能、稳定的 Java 程序,并能够更好地排查内存相关的问题(如。这些内存区域各自有不同的职责,共同支持 Java 程序的运行。在 Java 中,内存区域是 JVM(Java 虚拟机)管理的关键部分,主要包括。

huing的博客 1176

JVM内存区域划分(堆、栈、方法区等)‌

通过合理配置JVM参数(如堆大小、栈大小、元空间限制)和代码优化(如避免内存泄漏),可有效避免内存溢出问题。‌:Java 8前为永久代(方法区实现),Java 8+为元空间(本地内存)。‌:记录当前线程执行到的字节码指令地址(分支、循环、异常处理等依赖它)。‌:为JVM调用Native方法(如C/C++库)提供栈空间。(Java 7及之前):如动态生成大量类(反射、CGLib)。‌:方法执行时的临时数据存储区(如算术运算的中间结果)。

大牛 1071

常量池在堆还是方法区_java虚拟机运行时数据区

微信公众号:51码农网51码农网,让程序员坚持学习变得可能网站:www.51manong.comjava虚拟机运行时数据区java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域。根据《Java 虚拟机规范(Java SE 7版)》规定,Java虚拟机所管理的内存将会包括一下几个运行时数据区域。程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程执行的字节码的...

weixin_39994270的博客 1276

Java内存区域:堆、栈、方法区、运行时常量池、直接内存

Java内存区域 目录 文章目录Java内存区域目录介绍运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)本地方法栈(线程私有)堆方法区运行时常量池直接内存 介绍 Java虚拟机在执行Java程序的过程中将自己所管理的内存区域划分为不同的数据区域。有的区域随着虚拟机进程的启动而一直存在,有的则是跟随线程的启动和结束而建立和销毁。 运行时数据区域 Java虚拟机运行时数据区结构: 程序计数器(线程私有) 当前线程所执行的字节码行号指示器,所占内存很小,如果在执行的是一个Java方法,那么他的值

qq_41868309的博客 625

JVM运行时数据区(堆、虚拟机栈、本地方法栈、方法区、程序计数器...)

JVM虚拟机规范翻译 运行时数据区模型 在Java虚拟机中把内存分为若干个不同的数据区域。这些区域有各自的用途,有些区域随着虚拟机进程启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。在JVM中主要分为以下几个区域: 程序计数器 方法区 虚拟机栈 本地方法栈 Java堆 ​ 程序计数器 作用 程序计数器内存占用较小,是当前线程执行的字节码的行号指示器。字节码解释器就是通过这个改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、调整、异常处理、线程恢..

967

Java内存区域——堆,栈,方法区等

运行时数据区域 程序计数器 Java虚拟机栈 栈帧 本地方法栈 堆 方法区 运行时常量池 拓展 运行时数据区域 jdk1.7中, Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 程序计数器 1. 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码

凶残的程序员 1万+

Java常量池与方法区

转载自:1、添加链接描述 Java内存区域介绍(附带 JDK1.8后方法区内存结构的变化 2、添加链接描述 3、添加链接描述 4、添加链接描述 从字节码分析了JDK7中常量池放到堆中后的 内存结构 1、运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范(JavaSE7版)》的规定,java虚拟机所管理的内存将会包括以下几个...

HayPinF的博客 1571

java内存区域,java栈,堆,方法区,常量池

在不考虑实例对象入参的情况下,聊聊java的内存区域,各个内存区域之间的协同关系 经常有人将java内存区分为堆内存,和栈内存,期初我也是这么粗糙的去划分的,java内存区域的划分实际上远比这来的复杂。 1.java运行时数据区域 2.java对象构建-内存分配 ...

loney_wolf的博客 671
上一篇: Java 数据结构:什么是树?怎么使用?
下一篇: Java中高级核心知识全面解析——HTTPS中的TLS(从密码学的角度理解 HTTPS【TLS 工作流程、公钥密码】、TLS 总结)
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值