运行时的相互联系

  图4-2展示了已加载了CLR的一个Microsoft Windows进程。在这个进程中,可能存在多个线程。一个线程创建时,会分配到一个1MB大小的栈。这个栈的空间用于向方法传递实参,并用于方法内部定义的局部变量。

  栈是从高位内存地址向低位地址构建的。在图中,假设线程已经执行了一些代码(栈顶部的阴影区域标示这些代码的数据),现在线程执行的代码开始调用M1方法。

  M1方法执行时,[String name="Joe"]在线程栈上分配局部变量name的内存,如图4-3所示。

  然后,M1调用M2方法,将局部变量name作为一个实参来传递。这造成name局部变量中的地址被压入栈(参加图4-4)。在M2方法内部,将使用名为s的参数来标识栈位置。另外,调用一个方法时,还会将一个“返回地址”压入栈。被调用的方法在结束之后,应该返回到这个位置。

  M2方法开始执行时,线程栈中为局部变量length和tally分配内存,如图4-5所示。然后,M2方法内部的代码开始执行。最终,M2抵达它的return语句,造成CPU的指令指针被设置成栈中的返回地址,而且M2的栈帧会展开,使之看起来类似于图4-3。之后,M1将继续执行在M2调用之后的代码,M1的栈帧将准确反映M1需要的状态。

  最终,M1会返回到它的调用者。这同样是通过将CPU的指令指针设置成返回地址来实现的,而且M1的栈帧会展开,使之看起来类似于图4-2。之后,调用了M1的线程会继续执行在M1调用之后的代码,那个方法的栈帧将准确反映它需要的状态。

  假定有以下两个类定义:

internal class Employee{
    public    Int32    GetYearsEmployed(){...}
    public    Virtual   String    GenProgressReport(){...}
    public    static     Lookup(String name){...}
}

internal  sealed class Manager : Employee{
    public override String GenProcessReport(){...}
}

运行时的相互联系

时间: 2024-10-11 15:52:48

运行时的相互联系的相关文章

.Net 类型、对象、线程栈、托管堆运行时的相互关系

JIT(just in time)编译器 接下来的会讲到方法的调用,这里先讲下JIT编译器.以CLR书中的代码为例(手打...).以Main方法为例: static void Main(){ Console.WriteLine("Hello"); Console.WriteLine("XiaoCong"); } 首先CLR会检测到Main方法中引用了一个Console类型,然后CLR会为其分配一个内部结构. 内部结构中每个方法都对应一个记录项,记录项中都容纳一个地址

HotSpot运行时概览#2

HotSpot运行时概览#1 解释器 (译者注:解释器.编译器坑太大,翻译太水请见谅:) 当前HotSpot用于执行字节码的解释器是一种基于模板的解释器.虚拟机启动时,InterpreterGenerator会使用TemplateTable中的信息(每一个字节码对应的汇编代码)在内存中生成一个解释器.一个模板描述一个字节码.TemplateTable定义了所有字节码的模板,并提供了访问的方法.非生产标记-XX:+PrintInterpreter可以用来查看VM启动时在内存中生成的模板. 使用模板

iOS开发——高级特性&Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量

运行时内存模型

运行时内存模型运行时中,类型.对象.线程和托管对有相互的关系.CLR的一个windows进程,这个进程中可能存在多个现在.一个线程创建时,会分配1M的栈.这个栈主要用于方法传递实参和方法内部定义的局部变量.如果方法中有涉及到对象,则在堆中创建类型对象和类型实例.类型对象主要由类型对象指针.同步块索引.静态字段.方法列表组成.类型实例主要由类型对象指针.同步块索引.实例字段组成.其中类型实例的类型对象指针指向类型对象的类型对象指针.它们的相互关系如下图所示. 通过这张图,可以清楚了解运行时的内存由

对象与运行时内存

和大多数猴子一样,我原来也抵触对原理的学习, 后来发现掌握了原理才有了那种了然于胸,运筹帷幄的感觉,也就是顿悟. 这里主要介绍Java对象与运行时内存的知识. java运行时内存 Program Counter Registe(程序计数器): 记录当前线程执行字节码的位置,相当于行号指示器,为线程私有的. Java Virtual Machine Stacks(java虚拟机栈): 存放方法出口信息.局部变量表(对象引用.基本类型数据等),为线程私有的. Native Method Stack(

JVM 运行时数据区详解

一.运行时数据区: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域. 1.有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,所有的线程共享这些数据区. 2.第二种则是与线程一一对应,随线程的开始和结束而创建和销毁,线程之间相互隔离. java虚拟机所管理的内存将会包括以下几个运行时数据区域 二.数据区详解 1.程序计数器(Program Counter Register) 也叫PC寄存器是一块较小的内存空间,它的作用是存储当前线程所执行的字节码的信号指示器.

runtime 运行时机制 完全解读

runtime 运行时机制 完全解读 目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! 首先,第一个问题, 1>runtime实现的机制是什么,怎么用,一般用于干嘛? 这个问题我就不跟大家绕弯子了,直接告诉大家, runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API. 在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runti

深入理解Java运行时数据区

前情回顾 在本专栏的前12篇博客中, 我们主要大致介绍了什么是JVM, 并且详细介绍了class文件的格式. 对于深入理解Java, 或者深入理解运行于JVM上的其他语言, 深入理解class文件格式都是必须的. 如果读者对class文件的格式不是很熟悉, 在阅读本博客下面的文章之前, 建议先读一下前面的12篇博客, 或者参考其他资料, 熟悉class文件的格式. 在深入理解Java虚拟机到底是什么 这篇博客中, 我们有提到过, JVM就是一个特殊的进程, 我们执行的java程序, 都运行在一个

permission 文档 翻译 运行时权限

文档位置:API24/guide/topics/security/permissions.html System Permissions 系统权限 Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are also sep