走进 JVM 之内存布局

本贴最后更新于 1545 天前,其中的信息可能已经事过境迁

titlemem.png

内存布局

JVM 内存布局

1.堆(Heap)

存储着所有实例对象,GC 的相关详见上一篇

2.元空间(Metaspace)

永久代和元空间都是对方法区的一个实现,方法区是一块所有线程共享的内存区域。Java7 及之前为永久代(Perm),之后均为元空间,所以类元信息、字段、静态属性、方法、常量等都移动至元空间。

区别于永久代,元空间在本地内存中分配。

3.虚拟机栈(JVM Stack)

JVM 中的虚拟机栈是描述 Java 方法执行的内存区域,他是线程私有的。栈中的元素用于支持虚拟机方法调用,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。

通过递归调用可以更好地理解方法的调用,尤其是二叉树的中序遍历,逐级返回有点类似 JVM 类加载机制的双亲委派模型

局部变量表

存放方法参数和局部变量的区域

  • 操作数栈
  • 局部变量表
  • 常量池引用

操作栈

操作站是一个初始状态为空的桶式结构栈。在方法执行的过程中,会有各种指令往栈中写入和提取信息。

动态连接

每个栈帧包含一个常量池中对当前方法的引用,目的是支持方法调用过程的动态链接。

方法返回地址

  1. 正常退出,一些关键字 return
  2. 异常退出

只要是退出都会返回到方法被调用的位置。方法退出的过程相当于弹出当前栈帧。

  1. 返回值压入上层调用栈帧
  2. 异常信息抛给能够处理的栈帧
  3. PC 计数器指向方法调用后的下一条指令

4.本地方法栈(Native Method Stacks)

线程对象私有,虚拟机栈主内,本地方法栈主外。

线程调用本地方法的时候,会进入一个不再受 JVM 约束的世界,优点:极高的执行效率、偏底层的跨进程操作;缺点:威胁程序运行的稳定性。

JNI 最著名的本地方法:System.currentTImeMillis()

5.程序计数寄存器(Program Counter Register)

6.小结

从线程共享的角度来看,堆(Heap)和元空间(Metaspace)是线程共享的,其他都是线程内部私有的。

JVM 内存布局

  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...