JVM运行时内存整体结构一览

文章目录



在这里插入图片描述

在这里插入图片描述
Java 虚拟机 (JVM) 运行时内存由程序计时器, 堆, 方法区, 本地方法栈, 虚拟机栈,构成


Java 虚拟机 (JVM) 运行时内存布局主要包括以下几个部分:

程序计数器 (Program Counter Register):

每个线程都有一个程序计数器,它是当前线程执行的字节码指令的地址记录器。在多线程环境下,每个线程的程序计数器是独立的,以保证线程切换后能恢复到正确的执行位置。

Java 虚拟机栈 (Java Virtual Machine Stacks):

每个线程在创建时会分配一个对应的 Java 虚拟机栈,用于存储方法的调用和局部变量。每个方法在执行时会创建一个栈帧 (Stack Frame),栈帧包含了方法的局部变量、操作数栈、方法返回地址等信息。栈帧随着方法的调用和返回而入栈和出栈。

本地方法栈 (Native Method Stack):

与 Java 虚拟机栈类似,本地方法栈用于执行 Native 方法(使用本地语言如 C 或 C++ 实现的方法)的调用和管理。在一些特定情况下,使用本地方法接口 (JNI) 调用本地方法会使用到本地方法栈。

Java 堆 (Java Heap):

Java 堆是 Java 虚拟机管理的最大的一块内存区域,用于存放对象实例。所有通过 new 关键字创建的对象实例都存储在堆上。Java 堆在虚拟机启动时就会被创建,并且是所有线程共享的。堆的大小可以通过启动参数进行调整。

方法区 (Method Area):

方法区用于存储类的结构信息、静态变量、常量、方法字节码等数据。在 HotSpot 虚拟机中,方法区被称为永久代 (Permanent Generation, PermGen)。但在一些更新的 JVM 实现中,永久代已被元空间 (Metaspace) 取代。元空间的大小不再受限于虚拟机堆的大小,而是由操作系统的内存大小和虚拟地址空间的限制决定。


运行时常量池 (Runtime Constant Pool):

运行时常量池是方法区的一部分,用于存储编译期生成的各种字面量和符号引用。例如,类和接口的全限定名、字段和方法的名称和描述符等信息都存储在运行时常量池中。在运行期间,通过符号引用可以在常量池中查找到具体的字面量值或者方法、字段的内存布局。


直接内存 (Direct Memory):

直接内存并不是 Java 虚拟机运行时数据区的一部分,但是通过使用 NIO(New I/O)包中的 ByteBuffer 类,可以直接在堆外分配内存,称为直接内存。这块内存不受 Java 堆大小限制,且可以通过本地方法直接访问,可以用于高效地进行 I/O 操作。
这些内存区域共同构成了 Java 虚拟机的运行时内存布局,管理和优化这些内存区域对于提高 Java 应用程序的性能和稳定性至关重要。


运行时内存整体结构如下图所示:

在这里插入图片描述

在这里插入图片描述



在这里插入图片描述



  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值