美文网首页Android开发Android技术知识
阿里面試:JVM 中一个线程的 Java 栈和寄存器中分别放的是

阿里面試:JVM 中一个线程的 Java 栈和寄存器中分别放的是

作者: 5893d0835188 | 来源:发表于2020-09-03 13:54 被阅读0次

想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。
这个问题,要从线程和内存两个角度来讲解。
一、线程
线程从linux角度来看就是task_struct结构体,是一段可执行的代码,CPU调度的最小单位,这个不是楼主问题的重点,这里就不展开了;

二、其次关于Java栈和的寄存器问题,先来看看jvm的内存模型

jvm内存模型:Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。

运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆、方法区,在方法区内有一个常量池。java运行时的内存模型图,如下:

<noscript><img src="https://pic3.zhimg.com/50/be87523a50083ebbbd8fa83649568e48_hd.jpg?source=1940ef5c" data-rawwidth="801" data-rawheight="495" class="origin_image zh-lightbox-thumb" width="801" data-original="https://pic3.zhimg.com/be87523a50083ebbbd8fa83649568e48_r.jpg?source=1940ef5c"/></noscript>

[图片上传失败...(image-88de7b-1599112241867)]

从图中,可知内存分为线程私有和共享两大类:

(1)线程私有区,包含以下3类:

  • 程序计数器,记录正在执行的虚拟机字节码的地址;
  • 虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧;
  • 本地方法栈:虚拟机的Native方法执行的内存区;

(2)线程共享区,包含以下2类

  • Java堆:对象分配内存的区域;

  • 方法区:存放类信息、常量、静态变量、编译器编译后的代码等数据;

  • 常量池:存放编译器生成的各种字面量和符号引用,是方法区的一部分。

楼主提到的Java栈,一般而言是指图中的虚拟机栈,在代码中的方法调用过程中,往往需要从一个方法跳转到另一个方法,执行完再返回,那么在跳转之前需要在当前方法的基本信息压入栈中保存再跳转。

三、关于寄存器的问题

对于java最常用的虚拟机,sun公司提供的hotspot虚拟机,是基于栈的虚拟机;而对于android的虚拟机,则采用google提供的dalvik,art两种虚拟机,在android 5.0以后便默认采用art虚拟机,这是基于寄存器的虚拟机。 楼主问的是jvm(即java vm),这是基于栈的虚拟机。那么关于虚拟机栈,这块内存的内容,我们再进一步详细分析,如下图:

可以看到,在虚拟机栈有一帧帧的 栈帧组成,而栈帧包含局部变量表,操作栈等子项,那么线程在运行的时候,代码在运行时,是通过程序计数器不断执行下一条指令。真正指令运算等操作时通过控制操作栈的操作数入栈和出栈,将操作数在局部变量表和操作栈之间转移。

本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

作者:Gityuan
链接:https://www.zhihu.com/question/19748817/answer/88610988

相关文章

  • 阿里面試:JVM 中一个线程的 Java 栈和寄存器中分别放的是

    想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。这个问...

  • Java虚拟机结构、内存管理相关基础知识(1)

    JVM结构体系 在内存空间中方法区和堆是所有java线程共享的,而java栈、本地方法栈、PC寄存器则有每个线程私...

  • JVM面试详解

    1、JVM构成 Java栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类...

  • JVM基础结构与字节码执行引擎

    JVM基础结构 JVM内部结构如下:栈、堆。 栈 JVM中的栈主要是指线程里面的栈,里面有方法栈、native方法...

  • JVM栈以及其对线程并发量的影响

    JVM栈 ​根据JVM规范,JVM包括两种栈,java虚拟机栈和本地方法栈。也就是说,每当启动一个java线程时,...

  • JVM内存区域的一些理解

    JAVA的JVM内存空间分为三个重要区域:堆、栈和方法区 栈区 线程私有。每个线程有自己的栈区,栈中只保存了方法中...

  • Android内存相关

    Dalvik和标准Java虚拟机(JVM)首要差别Dalvik 基于寄存器,而JVM 基于栈,基于寄存器的虚拟机对...

  • iOS多线程编程——GCD与NSOperation

    多线程 线程,是执行程序最基本的单元,它有自己栈和寄存器.在十个线程之间来回切换,就意味着有十组栈和寄存器中的值需...

  • JVM浅析之二:运行时数据区域

    下面从线程共享角度来说明JVM运行时数据区域 线程私有: PC寄存器:存放线程内执行指令的地址 JVM栈:存放基本...

  • ALI

    1.java的内存: JVM中的栈记录了线程中的方法调用,没有线程都自己拥有一个栈 在栈中,只保存基本数据类型 b...

网友评论

    本文标题:阿里面試:JVM 中一个线程的 Java 栈和寄存器中分别放的是

    本文链接:https://www.haomeiwen.com/subject/arnnsktx.html