返回顶部
首页 > 资讯 > 后端开发 > Python >认识Java中的Stub与StubQueue
  • 800
分享到

认识Java中的Stub与StubQueue

2024-04-02 19:04:59 800人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、InterpreterCodelet与Stub类2、StubQueue类在文章开始前先简单介绍TemplateInterpreter::initialize()函数,在这个函

在文章开始前先简单介绍TemplateInterpreter::initialize()函数,在这个函数中会调用TemplateTable::initialize()函数初始化模板表,随后会使用new关键字初始化定义在AbstractInterpreter类中的_code静态属性,如下:


static StubQueue* _code;

由于TemplateInterpreter继承自AbstractInterpreter,所以在TemplateInterpreter中初始化的_code属性其实就是AbstractInterpreter类中定义的_code属性。

在initialize()函数中初始化_code变量的代码如下


// InterpreterCodeSize是在平台相关
// 的templateInterpreter_x86.hpp中
// 定义的,64位下是256 * 1024
int code_size = InterpreterCodeSize;
_code = new StubQueue(
                new InterpreterCodeletInterface, 
                code_size, 
                NULL,
                "Interpreter");


StubQueue是用来保存生成的本地代码的Stub队列,队列每一个元素对应一个InterpreterCodelet对象,InterpreterCodelet对象继承自抽象基类Stub,包含了字节码对应的本地代码以及一些调试和输出信息。下面我们介绍一下StubQueue类及相关类StubInterpreterCodelet类和CodeletMark类。

1、InterpreterCodelet与Stub类

Stub类的定义如下:


class Stub VALUE_OBJ_CLASS_SPEC { ... };


InterpreterCodelet类继承自Stub类,具体的定义如下


class InterpreterCodelet: public Stub {
 private:
  int                _size;         // the size in bytes
  const char*        _description;  // a description of the codelet, for debugging & printing
  Bytecodes::Code    _bytecode;     // associated bytecode if any
 
 public:
  // Code info
  address code_begin() const  {
     return (address)this + round_to(sizeof(InterpreterCodelet), CodeEntryAlignment);
  }
  address code_end() const {
     return (address)this + size();
  }
 
  int size() const {
     return _size;
  }
  // ...
  int code_size() const { 
     return code_end() - code_begin();  
  }
  // ...
};


InterpreterCodelet实例存储在StubQueue中,每个InterpreterCodelet实例都代表一段机器指令(包含了字节码对应的机器指令片段以及一些调试和输出信息),如每个字节码都有一个InterpreterCodelet实例,所以在解释执行时,如果要执行某个字节码,则执行的就是由InterpreterCodelet实例代表的机器指令片段。

类中定义了3个属性及一些函数,其内存布局如下图所示。

 

在对齐至CodeEntryAlignment后,紧接着InterpreterCodelet的就是生成的目标代码。

2、StubQueue类

StubQueue是用来保存生成的本地机器指令片段的Stub队列,队列每一个元素都是一个InterpreterCodelet实例。

StubQueue类的定义如下:


class StubQueue: public CHeapObj<mtCode> {
 private:
  StubInterface* _stub_interface;     // the interface prototype
  address        _stub_buffer;        // where all stubs are stored
 
  int            _buffer_size;       // the buffer size in bytes
  int            _buffer_limit;      // the (byte) index of the actual buffer limit (_buffer_limit <= _buffer_size)
 
  int            _queue_begin;       // the (byte) index of the first queue entry (Word-aligned)
  int            _queue_end;         // the (byte) index of the first entry after the queue (word-aligned)
 
  int            _number_of_stubs;   // the number of buffered stubs
 
 
  bool is_contiguous() const {
      return _queue_begin <= _queue_end;
  }
  int index_of(Stub* s) const {
      int i = (address)s - _stub_buffer;
      return i;
  }
  Stub* stub_at(int i) const {
      return (Stub*)(_stub_buffer + i);
  }
  Stub* current_stub() const {
      return stub_at(_queue_end);
  }
 
  // ...
}


这个类的构造函数如下:


StubQueue::StubQueue(
 StubInterface* stub_interface,  // InterpreterCodeletInterface对象
 int            buffer_size,     // 256*1024
 Mutex*         lock,
 const char*    name) : _mutex(lock)
{
  intptr_t     size = round_to(buffer_size, 2*BytesPerWord); // BytesPerWord的值为8
  BufferBlob*  blob = BufferBlob::create(name, size); // 在StubQueue中创建BufferBlob对象
 
  _stub_interface  = stub_interface;
 
  _buffer_size     = blob->content_size();
  _buffer_limit    = blob->content_size();
  _stub_buffer     = blob->content_begin();
 
  _queue_begin     = 0;
  _queue_end       = 0;
  _number_of_stubs = 0;
}


stub_interface用来保存一个InterpreterCodeletInterface类型的实例,InterpreterCodeletInterface类中定义了操作Stub的函数,避免了在Stub中定义虚函数。每个StubQueue都有一个InterpreterCodeletInterface,可以通过这个来操作StubQueue中存储的每个Stub实例。

调用BufferBlob::create()函数为StubQueue分配内存,这里我们需要记住StubQueue用的内存是通过BufferBlob分配出来的,也就是BufferBlob其本质可能是一个StubQueue。下面就来详细介绍下create()函数。


BufferBlob* BufferBlob::create(const char* name, int buffer_size) {
  // ...
  BufferBlob*    blob = NULL;
  unsigned int   size = sizeof(BufferBlob);
 
  // align the size to CodeEntryAlignment
  size = align_code_offset(size);
  size += round_to(buffer_size, oopSize); // oopSize是一个指针的宽度,在64位上就是8
 
  {
     MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
     blob = new (size) BufferBlob(name, size);
  }
 
  return blob;
}


通过new关键字为BufferBlob分配内存,new重载运算符如下:


void* BufferBlob::operator new(size_t s, unsigned size, bool is_critical) throw() {
  void* p = CodeCache::allocate(size, is_critical);
  return p;
}


codeCache中分配内存,CodeCache使用的是本地内存,有自己的内存管理办法,在后面将会详细介绍。

StubQueue的布局结构如下图所示。

队列中的InterpreterCodelet表示一个小例程,比如iconst_1对应的机器码,invokedynamic对应的机器码,异常处理对应的代码,方法入口点对应的代码,这些代码都是一个个InterpreterCodelet。整个解释器都是由这些小块代码例程组成的,每个小块例程完成解释器的部分功能,以此实现整个解释器。

到此这篇关于认识Java中的Stub与StubQueue的文章就介绍到这了,更多相关Stub与StubQueue内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 认识Java中的Stub与StubQueue

本文链接: https://lsjlt.com/news/135251.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 认识Java中的Stub与StubQueue
    目录1、InterpreterCodelet与Stub类2、StubQueue类在文章开始前先简单介绍TemplateInterpreter::initialize()函数,在这个函...
    99+
    2024-04-02
  • 重新认识Java中的ThreadLocal
    目录究竟是啥结构内存泄漏是什么鬼说来也惭愧,这个 ThreadLocal 其实一直都是一知半解,而且看了一下之后还发现记错了,所以还是记录下 原先记忆里的都是反过来,一个 Threa...
    99+
    2024-04-02
  • 一文带你认识java中的String类
    目录什么是字符串字符串常见的赋值方法直接赋值法字符串的比较相等字符串常量池字符串常量池的实例字符串的不可变字符串的常见操作字符串的比较字符串的查找字符串替换 split(S...
    99+
    2024-04-02
  • sql中的replace认识
      今天在修改sql中接触到了replace,和大家分享一下  replace('stat1','stat2','stat3') 例:select &nbs...
    99+
    2024-04-02
  • 带你全面认识Java中的异常处理
    目录Java异常处理异常体系的介绍常见运行时异常常见编译时异常补充:自定义异常总结 Java异常处理 异常体系的介绍 什么事异常处理 异常是程序在“编译&rdq...
    99+
    2022-12-26
    java中异常处理的机制 java中怎么处理异常 JAVA中异常处理的定义
  • Java 知识难点之异常的认知与使用详解
    目录前言一、 异常的背景初识异常数组下标越界访问 null 对象异常分为2种:异常体系:防御式编程:异常的好处LBYL 风格的代码(不使用异常)EAFP 风格的代码(使用异常)二、异...
    99+
    2024-04-02
  • 认识Java底层操作系统与并发基础
    目录一、现代计算机硬件结构1.CPU内部结构1.1.CPU缓存结构1.2.CPU运行安全等级2.操作系统内存管理3.进程与线程一、现代计算机硬件结构  核心部分:&nbs...
    99+
    2024-04-02
  • 初步认识Python中的列表与位运算符
    Python列表 List(列表) 是 Python 中使用最频繁的数据类型。 列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套)。 列表用[ ]标识。是pytho...
    99+
    2022-06-04
    运算符 列表 Python
  • 带大家认识Java语法之泛型与通配符
    目录⭐️前面的话⭐️1.泛型1.1泛型的用法1.1.1泛型的概念1.1.2泛型类1.1.3类型推导1.2裸类型1.3擦除机制1.3.1关于泛型数组1.3.2泛型的编译与擦除1.4泛型...
    99+
    2024-04-02
  • 怎样认识Python中的defaultdict
    怎样认识Python中的defaultdict,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。今天我们的主角是 defaultdict,同时也会介绍一下模仿方法&nbs...
    99+
    2023-06-04
  • 【JAVA】带你认识java方法|java中的方法&方法中的重载和递归
    作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将jav...
    99+
    2023-08-31
    java 开发语言
  • 一文带你认识Java中的Object类和深浅拷贝
    目录前言一.初识Object类1.Object类接收所有子类实例2.Object类部分方法介绍①.Object内的toString方法②.Object内的equals和hashCod...
    99+
    2023-05-17
    java深浅拷贝 java中object类型 java 深拷贝和浅拷贝
  • 认识Go语言的风险与应对策略
    认识Go语言的风险与应对策略 近年来,Go语言作为一种高效、简洁的编程语言,受到了越来越多开发者的青睐。然而,使用Go语言编写程序也存在一些潜在的风险,比如内存泄漏、并发竞争等问题。本...
    99+
    2024-03-05
    风险 go语言 应对策略
  • 重新认识MySQL中的COUNT语句
    在数据库的增删改查操作中,使用最频繁的就是查询操作。 而在所有查询操作中,统计数量操作更是经常被用到。 关于数据库中行数统计,无论是MySQL还是Oracle亦或者是SqlServer,都有一个函数可以使用,那就是COUNT。 而对于COU...
    99+
    2020-03-25
    重新认识MySQL中的COUNT语句
  • 认识与应用HTML缓存机制的重要性
    了解HTML缓存机制的重要性及应用,需要具体代码示例 HTML缓存机制是指在Web开发中,将Web页面的静态资源保存在客户端的缓存中,以减少服务器的请求次数和提高页面加载速度的一种技术。通过合理地应用HTML缓存机制,可以有效地...
    99+
    2024-01-23
    应用 重要性 HTML缓存
  • 认识Go语言中的引用传递
    在 go 中,传递引用类型变量时发生引用传递,其中 * 符号表示引用类型。传递引用类型变量时,实际上传递的是指向原始值的地址,修改引用类型变量会影响原始值。 认识 Go 语言中的引用传...
    99+
    2024-04-03
    go 引用传递 go语言
  • Java中类与对象的相关知识点总结
    目录一、面向过程与面向对象的理解二、类与对象的理解与认识三、类的成员1.字段/属性/成员变量2.对null的基本认识3.方法 (method)4.static 关键字四、封装1. p...
    99+
    2024-04-02
  • 好程序员带你认识HTML5中的WebSocket
      好程序员带你认识HTML5中的WebSocket,在HTML5 规范中,我最喜欢的Web技术就是正迅速变得流行的 WebSocket API。WebSocket 提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的...
    99+
    2023-06-03
  • Java中类与对象的相关知识点有哪些
    这篇文章给大家介绍Java中类与对象的相关知识点有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、面向过程与面向对象的理解C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。JAVA...
    99+
    2023-06-25
  • Type(术)霸 Vue:认识 TypeScript 在 Vue 中的优势
    TypeScript 是一种 JavaScript 超集,引入了类型系统和其它高级功能,为 Vue 应用程序开发带来了众多优势。通过本文,我们将探讨 TypeScript 在 Vue 中的主要优势,以及如何将其整合到您的项目中。 类型系统...
    99+
    2024-03-08
    TypeScript、Vue.js、类型系统、代码重构、代码质量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作