浅谈JVM之运行时数据区——Geek的博客。

浅谈JVM之运行时数据区

最近在准备春招的面试和笔试,今天四个笔试。可太得劲了。
也会整理一下每周的面经噢,有需要的码友可以关注一下。

JVM的定义:

Java 虚拟机,是一个可以执行 Java 字节码的虚拟机进程。

JVM的组成:

在这里插入图片描述

JVM主要由四部分组成:

  1. 类加载器子系统:用于加载字节码(.class)文件。
  2. 运行时数据区(内存区):将内存划分为若干个区,以模拟实际机器上功能。
  3. 执行引擎:负责执行字节码文件中的指令。
  4. 本地方法接口:调用c或c++实现本地方法。

JVM的内存模型(运行时数据区):

  1. 线程共享区:方法区、堆区。
  2. 线程私有区:程序计数器、虚拟机栈、本地方法栈。

先谈一谈方法区把:

先了解方法区、永久代、元空间者三者的关系:

-------方法区是规范,永久代和元空间是具体实现。或者说,方法区是Java中的接口,永久代、元空间是Java中接口的实现类。

作用:

  • JDK8之前叫永久代。永久代在堆区,用于存放类的元信息,及InstanceKlass类的实例(这个之后可以细说)。
  • JDK8及以后叫元空间,元空间在OS内存上,用于存放类的元信息。

堆区(重点):

内存模型中最核心的区域。
即是JVM调优,重点关注的地方,也是垃圾回收(GC)的主要区域。
在这里插入图片描述
作用:主要是用来存储对象的。

虚拟机栈、本地方法栈、程序计数器:

虚拟机栈:是用来存储局部变量和引用变量的。当方法被执行时,虚拟机都会同步创建一个栈帧用来执行该方法,方法的生命周期与改栈帧一样。

栈帧又包括:

  1. 局部变量表:局部变量表是用来存放方法参数和方法内部定义的局部变量,在Java程序被编译为字节码文件时,就确定了该方法局部变量表所需要的最大容量。
  2. 操作数栈:操作数栈可以理解为用于计算的临时数据存储区。
  3. 动态链接:每个栈帧都在常量池中保存了大量的符号引用。当前方法中如果需要调用其他方法的时候, 能够从运行时常量池中找到对应的符号引用, 然后将符号引用转换为直接引用,这样就能直接调用对应方法, 这就是动态链接。相对的,静态链接就是在类解析的过程中就会将符号引用转换为直接引用。
  4. 返回地址:在方法完成之后,都需要返回最初方法被调用时的位置,程序才能正常运行,所以会在栈帧中存储方法返回的地址,用来帮助程序返回。

本地方法栈:JAVA通过JNI调用C、C++动态链接库需要的栈,随着socket的发展,JNI技术已经用得非常非常少。

程序计数器:是当前线程所执行字节码的行号指示器。
在这里插入图片描述

简单来说就是字节码指令前面的index.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值