JVM系列(五)[Runtime Data Area运行时数据区,栈帧的组成,JVM Stack Instructions 指令集]

Runtime Data Area运行时数据区

概念

见名知意,就是JVM运行时的数据区,我们需要的数据一般都在这里.

前面已经知道,一个class文件,经过load-link-initialize加载到JVM.
然后,就是经过运行时引擎(run engine)进入运行时数据区(runtime data area).

最权威的参考文档:Java Virtual Machine Specification

结构

总体上分为线程私有和线程共享的两类:

  • 每个线程私有的区域: PC,VMStack,NativeMethodStack
  • 所有线程共享的区域:Heap,MethodArea,DirectMemory
    (MethodArea的实现:当JDK<1.8时 由PermSpace实现, 当JDK>=1.8时由MetaSpace实现)

每个区域详情:

  • Program Counter(PC)程序计数器: 存放指令位置,虚拟机不断的从PC中取出下一条指令的位置,找到指令去执行
  • heap堆:对象存放的地方,所有线程共享. 重点,后面GC详细学
  • JVM stacks: JVM管理的栈,每个线程有自己私有的JVM stack,其中的每个方法对应一个栈帧(frame). 重点
  • native method stacks本地方法栈:线程私有,通过JNI等调用C和C++方法时用的栈

栈包括JVM stacks和native method stacks
平时一般说到栈,指的都是JVM stacks

  • Direct Memory直接内存: 从JVM内可以访问OS管理的内存(内核空间),可以提高IO效率(零拷贝),JDK1.4新增的.
    比如一个网络请求传过来一个数据到OS内核空间中,1.4以前使用这个数据时需要把内核空间中的数据拷贝到JVM内存中;
    1.4之后,通过NIO可以使用直接内存,直接访问内核空间的该数据,不需拷贝.
  • method area方法区:class结构存放的地方,所有线程共享
    方法区中还有块 run-time constant pool 常量池,存放class文件的常量池(constant_pool)

方法区是一个逻辑上的概念
JDK1.8之前,方法区由永久区(Permament Space)实现,字符串常量也在永久区,FGC不会清理;JVM启动时指定永久区空间大小,不能改变
自JDK1.8开始,方法区由Meta Space实现,字符串常量位于堆,会触发FGC 被清理.可以指定大小,如果不指定的话,最大就是物理内存空间.

在这里插入图片描述

栈帧Frame

A Frame is used to store data and partial results,as well as to perform dynamic linking,return values for methods,and dispatch exceptions.
主要包括:

  1. 局部变量表(local variable table)
    注意,形参也在局部变量表;如果是成员方法,this也在局部变量表
    变量表从下标0开始,排序优先级为:this > 形参 > 方法中的变量
    形参和方法中的变量按出现的顺序排列
  2. 操作数栈(Operand Stacks)
    里面存的是一个个操作数,比如_load指令会把一个值压栈,_store指令会把栈顶的值弹出.

对于long的处理(store and load),多数虚拟机的实现都是原子的
jls 17.7,没必要加volatile

  1. dynamic linking,
    指向运行时常量池
    比如a() -> b(),方法a调用了方法b,class文件解析时把方法放在运行时常量池中了,这个就是用来找到b
    jvms2.6.3
    https://blog.csdn.net/qq_41813060/article/details/88379473
  2. return address
    a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

栈的指令集

这个指令集是JVM很底层的东西了,这个看明白了,任何其他语言也就很容易理解了,大家都差不多.
马老师说:别人看山是山,你看山是看到的都是各种分子,所以任何的山都是一样的.哈哈哈
第一个境界是 看山是山;
第二个境界是 看山不是山;
第三个境界是 看山还

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JVM内存模型是Java虚拟机在运行所使用的内存分配和管理方式。它包括了运行数据,也就是JVM在内存中划分的不同域,用来存储程序的数据指令JVM运行数据主要包括以下几个部分: 1. 堆(Heap):用于存储对象实例和数组。堆是线程共享的域,所有线程共同使用堆来创建和访问对象。 2. 方法(Method Area):用于存储已加载的类信息、常量、静态变量和编译后的代码等。方法也是线程共享的域,它在内存中占用一块连续的空间。 3. 虚拟机(VM Stack):每个线程在创建都会分配一个虚拟机,用来存储局部变量和方法调用信息。虚拟机是线程私有的,每个线程都有自己独立的虚拟机。 4. 本地方法(Native Method Stack):与虚拟机类似,用于存储本地方法调用的相关信息。 5. 程序计数器(Program Counter Register):用于存储当前线程执行的字节码指令的地址。 这些不同的运行数据JVM内存模型中起着不同的作用,可以提供给程序运行所需的各种资源和环境。例如,堆用于存储对象实例,方法用于存储类信息和静态变量,虚拟机用于存储方法的局部变量和方法调用信息等。 总的来说,JVM内存模型和运行数据是Java虚拟机在运行所使用的内存管理和分配方式。它们的不同域有不同的作用,用来存储程序的数据指令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [运行数据JVM内存模型](https://blog.csdn.net/weixin_45659364/article/details/124027073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JVM:Java内存模型与运行数据域](https://blog.csdn.net/m0_71777195/article/details/131655107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java内存模型与JVM运行数据别详解](https://download.csdn.net/download/weixin_38648037/12745990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值