虚拟机内存区域

虚拟机内存区域

运行时数据区域

K9MV0K.png

程序计数器(PC 寄存器)

程序计数器是当前线程所执行的字节码的行号(偏移地址)指示器。

作用

字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

虚拟机栈

每个线程对应一个虚拟机栈,它的生命周期与线程相同。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。所有的的栈帧都出栈后,线程也就完成了使命。

作用

每个方法在执行的同时都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法返回地址。

  • 局部变量表:存放八大原始类型、对象引用和返回地址类型。
  • 操作数栈:操作栈是个初始状态为空的桶式结构栈。在方法执行过程中,会有各种指令往栈中写入和提取信息。字节码指令集的定义都是基于栈类型的。
  • 动态连接:每个栈帧中包含一个在常量池中对当前方法的引用, 目的是支持方法调用过程的动态链接。
  • 方法返回地址:方法执行时退出,都将返回至方法当前被调用的位置。方法退出的过程相当于弹出当前栈帧。
图示

K9drR0.png

堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。同时它也是垃圾收集器管理的主要区域,因此也被称作垃圾收集器(GC)。

作用

存放对象和数组,JDK6后,字符串存放在字符串常量池和堆中;JDK8中,将字符串常量池存放在堆中。

  • String.intern():检查字符串常量池中是否存在该字符串对象引用,存在则返回池中对应引用;如果存在于堆中,则将堆中对应引用复制到池中并返回引用;都不存在则将对应引用加到池中,并返回其引用。

  • 字符串常量池:JDK6后,存放字符串常量和字符串对象引用。

堆空间内存分配

无论如何划分,都与存放内容无关,无论哪个区域,存放的都仍然是对象实例。

  • 年轻代:1/3 的堆空间
    • Eden:8/10 的年轻代空间
    • From Survivor:1/10 的年轻代空间
    • To Survivor:1/10 的年轻代空间
  • 老年代:2/3 的堆空间

元空间(方法区)

JDK8中,方法区(永久代)搬到了本地内存,并改名为元空间。元空间存放运行时常量池和 Class 常量池。

Class 常量池

每一个类被编译后,生成的类文件中包含了类的版本、字段、方法、接口等描述信息和常量池,常量池存放编译器生成的各种字面量和符号引用,一个类文件有一个 Class 常量池。

  • 字面量:包含文本字符串、常量的值和基本数据类型的值。
  • 符号引用:包含类和结构的全限定名、字段名称、方法名称和描述符。
  • 全限定名:比如com/pan176/test/TestClass是一个类的全限定名,只是把类全名中的.换成了/,为了使用连续的多个全限定名,在使用时最后一般会加入;
  • 简单名称:指没有类型和参数修饰的方法或字段名称,比如方法test()和字段name中的简单名称分别为testname
  • 描述符:用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。根据描述符规则,基本数据类型以及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符L加对象的全限定名来表示。
描述符标识字符表
标识字符含义
B基本类型 byte
C基本类型 char
D基本类型 double
F基本类型 float
I基本类型 int
J基本类型 long
S基本类型 short
Z基本类型 boolean
V特殊类型 void
L对象类型,如 Ljava/lang/Object
运行时常量池

当类加载到内存后,就把 Class 常量池中的内容放到运行时常量池里。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值