深入理解JVM(三)—JVM内存划分

一、JVM运行时数据区域

在这里插入图片描述
二、程序计数器
线程私有

当前线程所执行字节码的行号指示器,控制程序执行顺序,分支,循环,跳转。

三、虚拟机栈
线程私有

JVM栈是程序运行时单位,决定了程序如何执行,或者说数据如何处理。

Java栈内存,以帧的形式存放本地方法的调用状态,包括方法调用的参数、局部变量、中间结果等(方法都是以方法帧的形式存放在方法区的),每调用一个方法就将对应该方法的方法帧压入Java 栈,成为当前方法帧。当调用结束(返回)时,就弹出该帧。活动线程中,只有栈顶的栈帧是有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法,执行引擎所运行的所有字节码指令都只针对当前栈帧进行操作。

栈帧用于存储局部变量表,操作数栈,动态链接,方法返回地址等信息,在编译程序代码时,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定了,并且写入了方法表的Code属性之中。

名词解释:

操作数是那些被指令操作的数据
动态连接: Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用,一部分会在类加载阶段或第一次使用的时候转化为直接引用(如final、static域等),称为静态解析,另一部分将在每一次的运行期间转化为直接引用,这部分称为动态连接
在方法中定义的一些基本类型的变量和引用变量都在方法的栈内存中分配。当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(方法执行完成后),Java 会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作它用。同时,因为变量被释放,该变量对应的对象,也就失去了引用,也就变成了可以被gc对象回收的垃圾

栈中的两个常见异常:

1、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

2、如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常

四、本地方法栈
线程私有

本地方法栈则为使用到的本地操作系统(Native)方法服务。HotSpot不区分本地方法栈和虚拟机栈

五、堆
线程共享

堆空间是JAVA对象生死存亡的地区,存储类的实例对象,为它们分配需要的内存
垃圾回收的主要场所。划分:新生代 老年代
Java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。堆内存是我们调优的重要区域。
从软件设计的角度看,JVM栈代表了处理逻辑,而JVM堆代表了数据

六、方法区
线程共享

它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。类信息:
该类型的全限定名
该类型的直接超类的全限定名
该类型的访问修饰符(public、abstract、final)
字段信息:对类型中声明的每个字段,名称,类型,修饰符
方法信息,方法名,方法修饰符,方法参数的数量和类型(有序的),方法的返回类型(或 void)
指向ClassLoader类的引用
指向Class类的引用
方法表:为了能快速定位到类型中的某个方法,JVM对每个装载的类型都会建立一个方法表,用于存储该类型对象可以调用的方法的直接引用,这些方法就包括从超类中继承来的。而这张表与Java动态绑定机制的实现是密切相关的
方法区垃圾回收不频繁,也可以手动选择不回收
方法区有一块区域称为常量池:常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁
栈 堆 方法区

在这里插入图片描述
反射的基础

在装载类的时候,加入方法区中的所有信息,最后都会形成Class类的实例,代表这个被装载的类。方法区中的所有的信息,都是可以通过这个Class类对象反射得到

在运行时,JVM从常量池中获得符号引用,然后在运行时解析成引用项的实际地址,最后通过常量池中的全限定名、方法和字段描述符,把当前类或接口中的代码与其它类或接口中的代码联系起来
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值