CN110058859B - 程序运行及虚拟机实例的实现方法、装置、设备及介质 - Google Patents

程序运行及虚拟机实例的实现方法、装置、设备及介质 Download PDF

Info

Publication number
CN110058859B
CN110058859B CN201810049908.XA CN201810049908A CN110058859B CN 110058859 B CN110058859 B CN 110058859B CN 201810049908 A CN201810049908 A CN 201810049908A CN 110058859 B CN110058859 B CN 110058859B
Authority
CN
China
Prior art keywords
memory
runtime
cache pool
program running
thread
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810049908.XA
Other languages
English (en)
Other versions
CN110058859A (zh
Inventor
李勇彪
金一华
徐伟刚
李庆岩
孙哲
龚凯
杨辉
陈凌云
王帆
汪林
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Banma Zhixing Network Hongkong Co Ltd
Original Assignee
Banma Zhixing Network Hongkong Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Banma Zhixing Network Hongkong Co Ltd filed Critical Banma Zhixing Network Hongkong Co Ltd
Priority to CN201810049908.XA priority Critical patent/CN110058859B/zh
Priority to PCT/CN2019/070807 priority patent/WO2019141107A1/zh
Publication of CN110058859A publication Critical patent/CN110058859A/zh
Application granted granted Critical
Publication of CN110058859B publication Critical patent/CN110058859B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory management, e.g. access or allocation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本公开提出了一种程序运行及虚拟机实例的实现方法、装置、设备及介质。维护第一运行时,所述第一运行时包括能够被至少两个线程调用的第一对象;响应于线程被创建,维护对应于所述线程的第二运行时,所述第二运行时包括仅能够被所述线程调用的第二对象。由此,通过将能够被多个线程共享的对象放入一个全局对应的运行时(即第一运行时)中,而不是将其存储在各个线程的私有运行时(即第二运行时)中,可以大大节省内存空间。

Description

程序运行及虚拟机实例的实现方法、装置、设备及介质
技术领域
本公开涉及编程领域,特别是涉及一种程序运行及虚拟机实例的实现方法、装置、设备及介质。
背景技术
不同于C++或者Java等系统开发语言,JavaScript本身不支持多线程,JS虚拟机也只支持一个线程对应并拥有一个虚拟机运行时。
业界目前在JavaScript上的多任务标准是HTML5发布的Web Worker,这个标准采用的消息传递的方式来进行线程间的通信,即对于用户在不同的线程之间数据是互相隔离的,只有显示的发送消息才能通信。
一般浏览器对于Worker的实现是基于多线程多虚拟机实例的方案,即每一个线程拥有独立完整的虚拟机实例,虽然多个线程处于同一个进程中,但是各自所有的虚拟机实例中的虚拟机运行时互相完全隔离,JavaScript代码和对象均无法共享。这种实现一定程度上满足了多任务并行的需求,但线程间虚拟机运行时完全隔离,因此具有每个WebWorker内存占用高,启动时间长,对象传输慢等缺点。这也一定程度上限制了Web Worker在JavaScript中的使用和发展。
因此,需要一种能够节省内存开销的方案。
发明内容
本公开主要解决的技术问题是提供一种能够节省内存开销的程序运行及虚拟机实例的实现方法、装置、设备及介质。
根据本公开的第一个方面,提供了一种程序运行方法,包括:维护第一运行时,第一运行时包括能够被至少两个线程调用的第一对象;以及响应于线程被创建,维护对应于线程的第二运行时,第二运行时包括仅能够被线程调用的第二对象。
可选地,第一对象为不可变对象和/或不易改变的对象。
可选地,第一对象包括基本类型对象和/或虚拟机内部对象。
可选地,虚拟机内部对象包括与代码相关的虚拟机内部对象和/或用户不可见的虚拟机内部的数据对象。
可选地,第一对象包括以下一项或多项:
字符串对象;
数值对象;
脚本对象;
共享方法信息;
共享方法信息缓存池;
代码对象;
不可变对象的布局描述。
可选地,程序运行方法还包括:针对一个对象,将对象中能够被至少两个线程调用的部分作为第一对象,并且/或者,将对象中仅与单个线程相关的部分作为第二对象。
可选地,第一对象仅能够引用第一运行时中的其它对象,第二对象能够引用第一对象以及与第二对象属于同一第二运行时中的其它对象。
可选地,第一运行时还包括解析器、编译器以及解释执行引擎,并且/或者,第二运行时还包括编译器。
可选地,第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息,第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被其对应的线程调用的方法信息。
可选地,程序运行方法还包括:在要执行的方法属于第一对象的情况下,通过在第一方法缓存池中查找,来确定方法是否被编译;在方法被编译过的情况下,从第一方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。
可选地,程序运行方法还包括:在方法未被编译过的情况下,使用第一运行时中的编译器对方法进行编译,并将编译结果放入第一方法缓存池。
可选地,程序运行方法还包括:在要执行的方法属于第二对象的情况下,通过在第二方法缓存池中查找,来确定方法是否被编译;在方法被编译过的情况下,从第二方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。
可选地,程序运行方法还包括:在方法未被编译过的情况下,使用第二运行时中的编译器对方法进行编译,并将编译结果放入第二方法缓存池。
可选地,第一运行时还包括第一内存堆,用于存储第一对象,并且/或者第二运行时还包括第二内存堆,用于存储第二对象。
可选地,第一运行时还包括第一对象缓存池,用于缓存一个或多个已分配内存的第一对象,并且/或者第二运行时还包括第二对象缓存池,用于缓存一个或多个已分配内存的第二对象。
可选地,程序运行方法还包括:在申请分配内存的对象属于第一对象的情况下,查找第一对象缓存池中是否存在与申请分配内存的对象相匹配的对象;在第一对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,返回相匹配的对象。
可选地,程序运行方法还包括:在第一对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从第一内存堆中分配内存,并在分配成功后,将对象放入第一对象缓存池。
可选地,在申请分配内存的对象属于第二对象的情况下,查找第二对象缓存池中是否存在与申请分配内存的对象相匹配的对象;在第二对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,则返回相匹配的对象。
可选地,在第二对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从第二内存堆中分配内存,并在分配成功后,将对象放入第二对象缓存池。
可选地,第一运行时还包括第一回收器,并且/或者,第二运行时还包括第二回收器。
可选地,程序运行方法还包括:在第二内存堆的可用内存不足的情况下,第二回收器回收第二内存堆中活跃度低的对象所占用的内存。
可选地,第二回收器将第二内存堆中的活跃对象引用到的第二对象标记为活跃对象,直至没有新的活跃对象,并回收第二内存堆中未标记的对象所占用的内存。
可选地,程序运行方法还包括:在第二回收器执行回收操作后,第二内存堆的可用内存仍不足的情况下,判断第一内存堆中是否有可用内存;在判定第一内存堆中有可用内存的情况下,从第一内存堆中分配内存。
可选地,程序运行方法还包括:在第一内存堆的可用内存不足的情况下,第一回收器以及所有的第二回收器分别回收第一内存堆以及所有的第二内存堆中活跃度低的对象所占用的内存。
可选地,第一回收器以及所有的第二回收器分别将第一内存堆以及所有的第二内存堆中的活跃对象引用到的对象标记为活跃对象,直至没有新的活跃对象,并回收未标记的对象所占用的内存。
根据本公开的第二个方面,还提供了一种虚拟机实例的实现方法,包括:维护第一运行时和一个或多个第二运行时,第一运行时包括能够被运行在单虚拟机实例中的至少两个线程调用的第一对象,一个第二运行时对应一个线程,第二运行时包括仅能够被其对应的线程调用的第二对象。
可选地,虚拟机实例执行根据本公开的第一个方面述及的程序运行方法。
根据本公开的第三方方面,还提供了一种程序运行装置,包括:第一维护模块,用于维护第一运行时,第一运行时包括能够被至少两个线程调用的第一对象;以及第二维护模块,用于响应于线程被创建,维护对应于线程的第二运行时,第二运行时包括仅能够被线程调用的第二对象。
可选地,第一对象为不可变对象和/或不易改变的对象。
可选地,第一对象包括基本类型对象和/或虚拟机内部对象。
可选地,虚拟机内部对象包括与代码相关的虚拟机内部对象和/或用户不可见的虚拟机内部的数据对象。
可选地,第一对象包括以下一项或多项:
字符串对象;
数值对象;
脚本对象;
共享方法信息;
共享方法信息缓存池;
代码对象;
不可变对象的布局描述。
可选地,程序运行装置还包括:改造模块,用于针对一个对象,将该对象中能够被至少两个线程调用的部分作为第一对象,并且/或者,将对象中仅与单个线程相关的部分作为第二对象。
可选地,第一对象仅能够引用第一运行时中的其它对象,第二对象能够引用第一对象以及与第二对象属于同一第二运行时中的其它对象。
可选地,第一运行时还包括解析器、编译器以及解释执行引擎,并且/或者,第二运行时还包括编译器。
可选地,第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息,第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被线程调用的方法信息。
可选地,程序运行装置还包括第一查找模块,用于在要执行的方法属于第一对象的情况下,通过在第一方法缓存池中查找,来确定方法是否被编译,在方法被编译过的情况下,从第一方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。
可选地,在方法未被编译过的情况下,对方法进行编译,并将编译结果放入第一方法缓存池。
可选地,程序运行装置还包括第二查找模块,用于在要执行的方法属于第二对象的情况下,通过在第二方法缓存池中查找,来确定方法是否被编译,在方法被编译过的情况下,从第二方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。
可选地,在方法未被编译过的情况下,对方法进行编译,并将编译结果放入第二方法缓存池。
可选地,第一运行时还包括第一内存堆,用于存储第一对象,并且/或者第二运行时还包括第二内存堆,用于存储第二对象。
可选地,第一运行时还包括第一对象缓存池,用于缓存一个或多个已分配内存的第一对象,并且/或者第二运行时还包括第二对象缓存池,用于缓存一个或多个已分配内存的第二对象。
可选地,程序运行装置还包括第三查找模块,用于在申请分配内存的对象属于第一对象的情况下,查找第一对象缓存池中是否存在与申请分配内存的对象相匹配的对象,在第一对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,返回相匹配的对象。
可选地,程序运行装置还包括第一内存分配模块,用于在第一对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从第一内存堆中分配内存,并在分配成功后,将对象放入第一对象缓存池。
可选地,程序运行装置还包括第四查找模块,用于在申请分配内存的对象属于第二对象的情况下,查找第二对象缓存池中是否存在与申请分配内存的对象相匹配的对象,在第二对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,则返回相匹配的对象。
可选地,程序运行装置还包括第二内存分配模块,用于在第二对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从第二内存堆中分配内存,并在分配成功后,将对象放入第二对象缓存池。
可选地,第一运行时还包括第一回收器,并且/或者,第二运行时还包括第二回收器。
可选地,在第二内存堆的可用内存不足的情况下,第二回收器回收第二内存堆中活跃度低的对象所占用的内存。
可选地,第二回收器将第二内存堆中的活跃对象引用到的对象标记为活跃对象,直至没有新的活跃对象,并回收第二内存堆中未标记的对象所占用的内存。
可选地,程序运行装置还包括判断模块,用于在第二回收器执行回收操作后,第二内存堆的可用内存仍不足的情况下,判断第一内存堆中是否有可用内存,在判定第一内存堆中有可用内存的情况下,第一内存分配模块从第一内存堆中分配内存。
可选地,在第一内存堆的可用内存不足的情况下,第一回收器以及所有的第二回收器分别回收第一内存堆以及所有的第二内存堆中活跃度低的对象所占用的内存。
可选地,第一回收器以及所有的第二回收器分别将第一内存堆以及所有的第二内存堆中的活跃对象引用到的对象标记为活跃对象,直至没有新的活跃对象,并回收未标记的对象所占用的内存。
根据本公开的第四个方面,还提供了一种虚拟机实例的实现装置,包括:第一维护装置,用于维护第一运行时;以及第二维护装置,用于维护一个或多个第二运行时,第一运行时包括能够被运行在虚拟机实例中的至少两个线程调用的第一对象,一个第二运行时对应一个线程,第二运行时包括仅能够被其对应的线程调用的第二对象。
根据本公开的第五个方面,还提供了一种计算设备,包括:处理器;以及存储器,其上存储有可执行代码,当可执行代码被处理器执行时,使处理器执行如本公开的第一个方面或第二个方面述及的方法。
根据本公开的第六个方面,还提供了一种非暂时性机器可读存储介质,其上存储有可执行代码,当可执行代码被电子设备的处理器执行时,使处理器执行如本公开的第一个方面或第二个方面述及的方法。
本公开通过维护一个与全局对应的运行时(即第一运行时),将能够被多个线程共享的对象放入其中,与分别存储在各个线程的私有运行时中的方案相比,可以大大节省内存空间。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了本公开的虚拟机实例的结构框架示意图。
图2示出了本公开一实施例的程序执行流程的示意图。
图3示出了本公开一实施例的对象分配流程的示意图。
图4示出了Local GC中的标记对象的示意图。
图5示出了根据本公开一实施例的程序运行装置的结构示意图。
图6示出了根据本公开一实施例的程序运行装置的结构示意图。
图7示出了根据本公开一实施例的计算设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
【术语解析】
首先,就本公开涉及的术语做简要说明。
JS,JavaScript语言的简称。
JS虚拟机,编译和运行JavaScript源码的装置。
Web Worker,W3C发布的给Web应用开发提供后台并行地执行JavaScript代码能力的一种机制,定义了一套API标准。本公开述及的Worker是Web Worker的简称。
Heap,内存堆,本公开中是指由JS虚拟机管理的存放JS运行时对象的内存区域。
Garbage Collector,垃圾回收器,用于回收无引用对象所占用的内存。
GC,Garbage Collector的简称。
Runtime,虚拟机运行时,包括虚拟机用于支持用户代码运行的模块,数据以及存放JS运行时对象的Heap。
虚拟机实例,虚拟机执行JS程序所需要的代码和数据结构的总称,一个虚拟机实例包括一个Runtime。
Global Heap,全局共享堆,分配在其中的对象可以在多个线程间使用。
Local Heap,线程私有的堆,分配在其中的对象只能在本线程中使用。
Global Runtime,全局的虚拟机的运行时,由线程间可共享的部分组成。GlobalRuntime含有Global Heap。
Local Runtime,线程私有的虚拟机运行时,线程私有的部分组成。Local Runtime含有Local Heap。
Global Object,全局共享对象,可以在多个线程中使用。Global Object被分配在Global Heap中。
Local Object,线程私有对象,只能在创建该对象的线程中使用。Local Object被分配在该线程的Local Heap中。
Local GC,本公开提出的针对特定Local Heap的对象回收机制。
All GC,本公开提出的针对所有Local Heap和Global Heap的对象回收机制。
对象,本公开述及的对象可以是程序运行涉及的所有事物,如字符串、数字、数组、日期、方法、编译器、解释器等。
【方案概述】
本公开通过维护一个与全局对应的运行时(Global Runtime,也即下文述及的第一运行时),将能够被多个线程共享的对象放入其中,并为每个线程维护一个线程私有的运行时(Local Runtime,也即下文述及的第二运行时),线程私有的运行时中存储仅能够被该线程使用的对象。如此,共享的对象是存储在Global Runtime中,而不是分别存储在各个线程的Local Runtime中,因此可以节省内存空间。
并且,Global Runtime中的共享对象还可以包括经过编译后的共享方法信息,Local Runtime中也可以存储经过编译后的私有方法信息。如此,可以避免线程对同一份源代码的重复解析和编译产生的开销,节省程序运行时间。
进一步地,本公开还提出了一种Local GC辅以All GC的方案作为多线程虚拟机的完整GC方案。在单个线程执行Local GC时,其它线程不需要停顿。
下面以JavaScript为例,就本公开涉及的各种方面做详细说明。应该知道,本公开也可以适用于其它多种类型的编程语言,并且在应用于其他编程语言时,也可以根据具体编程语言的实现机理做适应性改变,此处不再赘述。
【虚拟机实例架构】
图1示出了本公开的虚拟机实例的结构框架示意图。
参见图1,可以为进程(Process)内的虚拟机实例维护一个第一运行时(即GlobalRuntime)和一个或多个第二运行时(即Local Runtime)。
第一运行时可以存放线程间共享的装置和/或数据,全局一个实例。第二运行时可以存放线程自身相关的装置和/或数据,一个线程一个实例。
具体地,第一运行时可以包括第一内存堆(Global Heap),第二运行时可以包括第二内存堆(Local Heap)。
第一运行时中的第一内存堆中可以存放能够被运行在虚拟机实例中的至少两个线程调用的第一对象(即Global Object)。一个第二运行时对应一个线程,第二运行时中的第二内存堆中可以存放仅能够被其对应的线程调用的第二对象(即Local Object)。
如图1所示,第一运行时还可以包括解析编译JS源码的解析器(Parser)和编译器(Compiler)以及执行编译器生成的字节码的解释执行引擎(Interpreter,也即解释器)。其中,解析器也可以视为编译器的一部分,即第一运行时也可以仅包括编译器。另外,第一运行时还可以包括第一回收器以及其它资源。其中,第一回收器可以用于回收第一内存堆中的无引用对象所占用的内存,其它资源可以是指类似多线程逻辑行为无改变的基础设施,例如可以是后台运行的Worker线程池。其中,解析器(Parser)和编译器(Compiler)可以用于解析、编译属于第二对象的共享方法,另外,在线程对应的第一运行时中没有编译器的情况下,也可以用于解析、编译线程对应的方法。解释执行引擎(Interpreter)可以用于执行所有的经过编译后的方法。
第二运行时还可以包括编译器、第二回收器以及其它资源。其中,第二运行时中的编译器可以用于负责对应的线程相关的方法的编译,该编译器优选地可以是即时编译器(JIT)。第二回收器可以用于回收其对应的第二内存堆中的无引用对象所占用的内存。其它资源可以是线程本地持有的一些基础设施和数据。
作为本公开的一个示例,第一运行时还可以包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息,第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被单个线程调用的方法信息。
作为本公开的另一个示例,第一运行时还可以包括第一对象缓存池,用于缓存一个或多个已分配内存的第一对象,第二运行时还可以包括第二对象缓存池,用于缓存一个或多个已分配内存的第二对象。对象缓存池中可以缓存常用的对象,以减小新建对象造成的耗时。
需要说明的是,本公开的虚拟机实例主要包括Global Runtime和Multi-Local-Runtime(即多个Local Runtime)。Global Runtime包括一个Global Heap,用于存储能够被至少两个线程调用的Global Object,每个Local Runtime包括一个Local Heap,用于存储仅能够被其对应的线程调用的Local Object。除此之外,至于其它一个或多个具体模块是否划入Global Runtime,并不影响本公开的虚拟机实例的整体架构。例如,Global Runtime可以包括一个全局共享的编译器、解释执行器,也可以不包括编译器、解释执行器,而是在每个线程对应的Local Runtime中设置一个编译器、解释执行器。
另外,虚拟机实例内部可以创建线程,调用创建新线程的接口时需要传入线程运行的执行方法。虚拟机调用系统函数创建系统线程后会创建并初始化支持新创建的线程的运行环境的Local Runtime,然后再调用用户传入的线程执行方法。可见本方案在多线程执行时是只有一个虚拟机实例,包含一个共享的Global Runtime以及多个线程自有的LocalRuntime。
至此,结合图1就本公开的虚拟机实例的架构做了示意性说明。
【第一对象/第二对象】
如上文所述,第一运行时包括能够被至少两个线程调用的第一对象,第二运行时包括仅能够被单个线程调用的第二对象。
第一对象可以视为共享对象(Global Object),是指能够被多个(至少两个)线程使用的对象。第二对象可以视为线程私有对象(Local Object),只能在创建该对象的线程中使用。第一对象仅能够引用第一运行时中的其它对象。第二对象能够引用第一对象以及与第二对象属于同一第二运行时中的其它对象。
在本公开中,可以根据对象在生命周期中的变化特性为主要特征划分第一对象和第二对象。如可以将对象在生命周期中不可变或不易改变的对象划分为第一对象,存入第一运行时中的第一内存堆中。
不可变对象是指创建后不再变化的对象,例如基本类型(Primitive)对象,可以包括字符串(String)、数值(Number,如可以是HeapNumber)、布尔对象(Boolean)等。这部分对象在生命周期内的值是不可变的,这些对象共享不会造成线程间的互相影响。
不易改变的对象主要是指不易发生变化的虚拟机内部对象,可以包括与代码相关的虚拟机内部对象和其它用户不可见且不易变的虚拟机内部的数据对象。
例如,与代码相关的虚拟机内部对象可以包括脚本对象、共享方法信息对象(主要是JS方法的共享信息)、代码对象等。这部分对象一旦生成完毕,在剩余的生命周期内也基本不会改变。其它用户不可见且不易变的虚拟机内部的数据对象可以包括不可变对象的布局描述、共享对象的容器如字符串表、共享方法信息缓存池(主要是缓存编译好的共享方法信息的容器)等。
在本公开中,共享方法是指能够被多个线程调用的方法,其可以包括虚拟机提供的基本功能的内建(Builtin)方法的集合,也可以包括其它能被多个线程调用的方法。
【对象改造】
根据对象的功能,本公开还可以重新设计某些种类对象的布局(也即可以对对象进行拆分),将对象中能够被共享的部分(例如能够被至少两个线程调用的部分)作为第一对象,存储在第一运行时中的第一内存堆中,并且还可以将对象中与单个线程相关的部分作为第二对象,存储在该线程对应的第二运行时中的第二内存堆中。
例如,对于共享方法信息对象中的字节码信息、名字等可以全局共享且生成后不变的成员可以仍然作为共享方法信息对象存储在第一运行时的第一内存堆中。而每个线程该方法的运行次数、优化编译次数等与线程相关的信息可以放置在该线程方法信息相关的容器中。
【程序执行流程】
本公开述及的程序优选地是指基于单线程编程语言(例如JavaScript)编写的源代码。以JS语言为例,JS源码可以运行在图1所示的虚拟机实例中。
图2示出了本公开一实施例的程序执行流程的示意图。
参见图2,本公开述及的线程是指程序运行过程中创建的用于执行相应方法的线程。响应于线程的创建,可以创建针对该线程的第二运行时,第二运行时中可以存储与该线程自身相关的私有数据。在线程的初始化工作完成后,可以执行步骤S110,加载传入的JS代码文件(即源代码)。然后执行步骤S120,分析判断所要执行的方法是否是共享的,即判断要执行的方法是否属于第一对象。在本公开中,普通JS的方法信息均可以被共享。
在要运行的方法属于线程私有对象(即第二对象)的情况下,可以执行步骤S140,通过查找该线程对应的Local Heap中的方法信息缓存容器(即上文述及的第二方法缓存池),确定该方法是否被编译过。如果编译过,则执行步骤S190,从该容器中获取对应的共享代码和对象,直接运行获取的代码。否则执行步骤S160,编译器(可以是线程中的编译器,例如JIT)会编译该方法,并且执行步骤S180,将编译得到的结果放入该共享容器(即第二方法缓存池)中,然后再执行步骤S190,运行生成的代码。
在要运行的方法属于共享对象(即第一对象)的情况下,可以执行步骤S130,通过查找Global Runtime的全局共享的方法信息缓存容器(即上文述及的第一方法缓存池),确定该方法是否被编译过。如果编译过,则从该容器中获取对应的共享代码和相关GlobalObject,直接执行步骤S190,运行获取的代码。否则执行步骤S150,使用编译器编译该方法,并且执行步骤S170,将编译得到的结果放入该共享容器中,然后再执行步骤S190,运行生成的代码。
由此,在线程再次遇到之前编译过的方法时,可以直接从相应的共享容器(第一方法缓存池或第二方法缓存池)中取得,而无需重新编译。
【对象申请分配流程】
如上文所述,第一内存堆和/或第二内存堆中还可以维护一个对象缓存池,用于缓存已为其分配内存的一个或多个对象。因此,可以把所申请的对象分为四种类型:
1)普通的Local Object,申请内存的对象对应的Local Heap中没有对象缓存池;
2)有对象缓存池的Local Object,申请内存的对象对应的Local Heap中有对象缓存池;
3)普通的Global Object,申请内存的对象对应的Global Heap中没有对象缓存池;
4)有对象缓存池的Global Object,申请内存的对象对应的Global Heap中有对象缓存池。
不同类型的对象会在处理分配请求时有不同的处理流程。
图3示出了本公开一实施例的对象分配流程的示意图。
参见图3,301为对象识别装置,可以用于识别申请内存的对象的类型,即识别申请内存的对象属于第一对象,还是第二对象。
302为第二内存堆(Local Heap)中的内存分配管理器,可以负责该Heap中内存的分配和GC(垃圾回收)。该装置收到Local Heap的内存分配请求时,第一步是尝试在可用的内存中分配所需大小的内存存储单元。如果成功则直接返回分配出来的存储单元。如果失败,则触发Local GC。Local GC后查看是否有新的可用内存,若无则程序报内存溢出的异常。如果Local GC后有新的可用内存产生,则重新进行第一步。该装置对申请Local Heap内存的请求有两种结果,一种是分配成功返回满足需求的内存存储单元,另一种则是分配失败抛出程序内存溢出异常(即OOM,Out Of Memory)。
303为第一内存堆(Global Heap)中的内存分配管理器,负责该Heap中内存的分配和GC(垃圾回收)。该装置收到Global Heap的内存分配请求时,第一步是尝试在可用的内存中分配所需大小的内存存储单元。如果成功则直接返回分配出来的存储单元。如果失败,则触发All GC。All GC后查看是Global Heap否有新的可用内存,若无则程序报内存溢出的异常。如果All GC后有新的可用内存产生,则重新进行第一步。该装置对申请Global Heap内存的请求有两种结果,一种是分配成功返回满足需求的内存存储单元,另一种则是分配失败抛出OOM。
为对象分配内存的具体处理流程如下。
在步骤S201,接收到新的对象的内存分配请求。
在步骤S203,可以首先识别对象是否为共享对象,即对象属于第一对象还是第二对象。
(1)在对象属于第一对象的情况下
在步骤S221,判断对象是否第一对象缓存池中的对象,即识别对象是普通的Global Object,还是有对象缓存池的Global Object。
在识别对象是普通的Global Object的情况下,可以执行步骤S223,在GlobalHeap中分配内存。
在识别对象是有对象缓存池的Global Object的情况下,可以执行步骤S222,进一步判断第一对象缓存池中是否有匹配对象。如果第一对象缓存池中有匹配对象,则可以执行步骤S261,返回匹配对象。如果第一对象缓存池中没有匹配对象,则可以返回执行步骤S223,在第一内存堆(Global Heap)中分配内存。
在步骤S224,判断步骤S223是否分配成功。
在分配成功的情况下,在步骤S241,初始化赋值。
在步骤S251,放入该类型对象的对象缓存池(即第一对象缓存池)中。
在步骤S261,返回成功。
在分配不成功的情况下,表明内存堆中无可用内存,此时可以执行步骤S225,触发All GC。
All GC后,在步骤S226,判断是否有可用内存,如果有可用内存,则返回步骤S223,进行分配。如果没有可用内存,则跳至步骤S231,抛出OOM。
(2)在对象属于第二对象的情况下
在步骤S211,判断对象是否第二对象缓存池中的对象,即识别对象是普通的LocalObject,还是有对象缓存池的Local Object。
在识别对象是普通的Local Object的情况下,可以执行步骤S213,在Local Heap中分配内存。
在识别对象是有对象缓存池的Local Object的情况下,可以执行步骤S212,进一步判断第二对象缓存池中是否有匹配对象。如果第二对象缓存池中有匹配对象,则可以执行步骤S261,返回匹配对象。如果第二对象缓存池中没有匹配对象,则可以返回执行步骤S213,在Local Heap中分配内存。
在步骤S214,判断步骤S213是否分配成功。
在分配成功的情况下,在步骤S241,初始化赋值。
在步骤S251,放入该类型对象的对象缓存池(即第二对象缓存池)中。
在步骤S261,返回成功。
在分配不成功的情况下,表明第二内存堆中无可用内存,可以执行步骤S215,触发Local GC。
Local GC后,在步骤S216,判断是否有可用内存,如果有可用内存,则返回步骤S213,进行分配。如果没有可用内存,则可以跳至步骤S231,抛出OOM。
如图3所示,在执行完步骤S216后,如果没有可以内存,也可以执行步骤S217,判定第一内存堆中是否有可用内存。如果第一内存堆中有可用内存,可以跳至步骤S223,从第一内存堆中分配对象。即在第二内存堆中实在没有可用内存的情况下,也可以在第一内存堆中为申请内存的第二对象分配内存空间。
【内存回收机制】
如上文所述,本公开的内存回收机制主要包括两种类型,All GC和Local GC。所有的GC基本都可以分为两个阶段。
标记阶段:从初始的活跃对象集合(一般称为根集)开始,把活跃对象引用到的对象也标记为活跃对象,直到无法标记新对象为止。这个阶段可以找到所有活跃对象。
回收阶段:回收未标记的对象所占有的内存区域。
(1)All GC
All GC需要回收Global Heap和所有的Local Heap中的无用内存。它的实现和传统的多线程虚拟机的GC方案没有区别,先从整个进程(即整个虚拟机实例)的初始活跃对象集合开始,对Global Heap和所有Local Heap中活跃对象引用到的对象进行标记,如可以标记为活跃对象,直到无法标记新对象为止。然后把没被标记的对象所占用的存储单元回收掉。在此过程中,需要所有的运行线程停止一段时间。
All GC是在Global Heap中分配Global Object时遇到内存不足的情况下,对Global Heap和所有的Local Heap发起的全局内存垃圾回收方案。
(2)Local GC
如上文所述,一个线程的Local Object只会引用到Global Object和本线程的Local Object,一个线程的Local Object是否活跃不会影响到其他线程的Local Object。
因此,如图4所示,针对线程Local Heap的Local GC的标记阶段可以从本线程的初始有效对象集合(线程根集,Thread Roots)开始,把本线程的Local Heap中的活跃对象所引用到的Local Object标记为活跃对象,直到无法标记新对象为止。然后将Local Heap中未被标记的对象所占用的存储单元回收掉。
可见,回收过程仅是对单个线程中的Local Heap进行回收,而单个线程的LocalObject是否活跃不会影响到其他线程的Local Object,因此在针对某一个或某几个线程进行Local GC时,不会影响其它线程的正常运行。同理,其他线程在执行和Local GC的过程中,也不会影响本线程的Local Heap。
另外,在执行Local GC的过程中,可以忽略从Local Object到Global Object的引用,也就是说,可以仅对本线程的Local Heap中的Local Object进行标记,而可以不对Global Heap中的Global Object进行标记。
综上,Local GC是在本公开的“Global Heap+Multi-Local-Heap”这一虚拟机实例架构基础上提出的新的局部GC(垃圾回收)的方案。Local GC指的是本线程在分配线程本地对象时遇到内存不足的情况下,对本线程的Local Heap发起的局部内存垃圾回收方案。
【同步访问】
多线程的共享会造成共享对象(Global Object)的访问加上同步的开销,由于本公开中的Global Object都是不易改变的,因此在同步访问的实现上主要采用偏向锁和轻量锁的实现,在不发生数据竞争的情况下,同步的开销非常之少。上述同步锁的实现技术较为成熟,且在多线程虚拟机的实现中应用广泛,本文不再展开描述。
【程序运行装置】
图5示出了根据本公开一实施例的程序运行装置的结构示意图。其中,程序运行装置600的功能模块可以由实现本发明原理的硬件、软件或硬件和软件的结合来实现。本领域技术人员可以理解的是,图5所描述的功能模块可以组合起来或者划分成子模块,从而实现上述发明的原理。因此,本文的描述可以支持对本文描述的功能模块的任何可能的组合、或者划分、或者更进一步的限定。
下面就程序运行装置600可以具有的功能模块以及各功能模块可以执行的操作做简要说明,对于其中涉及的细节部分可以参见上文描述,这里不再赘述。
参见图5,程序运行装置600可以包括第一维护模块610和第二维护模块620。
第一维护模块610用于维护第一运行时,第一运行时包括能够被至少两个线程调用的第一对象。响应于线程被创建,第二维护模块620可以维护对应于该线程的第二运行时,第二运行时包括仅能够被该线程调用的第二对象。
关于第一对象、第二对象以及第一运行时、第二运行时还可以具有的器件和/或数据,可以参见上文相关描述,此处不再赘述。
如图5所示,程序运行装置600还可以包括改造模块630。
针对一个对象,改造模块630可以将该对象中能够被至少两个线程调用的部分作为第一对象,并且还可以将该对象中仅与单个线程相关的部分作为第二对象。
如图5所示,程序运行装置600还可以包括第一查找模块640。
在要执行的方法属于第一对象的情况下,第一查找模块640可以通过在第一方法缓存池中查找,来确定方法是否被编译,在方法被编译过的情况下,从第一方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。另外,在方法未被编译过的情况下,可以对方法进行编译,并将编译结果放入第一方法缓存池。
如图5所示,程序运行装置600还可以包括第二查找模块650。
在要执行的方法属于第二对象的情况下,第二查找模块650可以通过在第二方法缓存池中查找,来确定方法是否被编译,在方法被编译过的情况下,从第二方法缓存池中获取与方法对应的编译后的代码,并运行所获取的代码。另外,在方法未被编译过的情况下,可以对方法进行编译,并将编译结果放入第二方法缓存池。
如图5所示,程序运行装置600还可以包括第三查找模块660。
在申请分配内存的对象属于第一对象的情况下,可以通过第三查找模块660查找第一对象缓存池中是否存在与申请分配内存的对象相匹配的对象,在第一对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,返回相匹配的对象。
如图5所示,程序运行装置600还可以包括第一内存分配模块670。
在第一对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,第一内存分配模块670可以从第一内存堆中分配内存,并在分配成功后,将对象放入第一对象缓存池。
如图5所示,程序运行装置600还可以包括第四查找模块680。
在申请分配内存的对象属于第二对象的情况下,第四查找模块680可以查找第二对象缓存池中是否存在与申请分配内存的对象相匹配的对象,在第二对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,则返回相匹配的对象。
如图5所示,程序运行装置600还可以包括第二内存分配模块690。
在第二对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,第二内存分配模块690可以从第二内存堆中分配内存,并在分配成功后,将对象放入第二对象缓存池。
另外,第一运行时还包括第一回收器,第二运行时还包括第二回收器。在第一内存堆存在内存不足的情况下,可以由第一回收器和所有的第二回收器执行All GC回收机制,在一个或多个线程存在内存不足的情况下,可以由相应的第二回收器执行Local GC这一回收机制。关于All GC和Local GC的具体实现过程可以参见上文相关描述,此处不再赘述。
如图5所示,程序运行装置600还可以包括判断模块695。在第二回收器执行回收操作(Local GC)后,第二内存堆的可用内存仍不足的情况下,可以由判断模块695判断第一内存堆中是否有可用内存,在判定第一内存堆中有可用内存的情况下,可以由第一内存分配模块670从第一内存堆中为要申请内存的第二对象分配内存。
【虚拟机实例的实现装置】
图6示出了根据本公开一实施例的程序运行装置的结构示意图。其中,虚拟机实例的实现装置700的功能模块可以由实现本发明原理的硬件、软件或硬件和软件的结合来实现。本领域技术人员可以理解的是,图7所描述的功能模块可以组合起来或者划分成子模块,从而实现上述发明的原理。因此,本文的描述可以支持对本文描述的功能模块的任何可能的组合、或者划分、或者更进一步的限定。
下面就虚拟机实例的实现装置700可以具有的功能模块以及各功能模块可以执行的操作做简要说明,对于其中涉及的细节部分可以参见上文描述,这里不再赘述。
参见图6,虚拟机实例的实现装置700可以包括第一维护装置710和第二维护装置720。
第一维护装置710用于维护第一运行时,第二维护装置720用于维护一个或多个第二运行时。第一运行时包括能够被运行在虚拟机实例中的至少两个线程调用的第一对象,一个第二运行时对应一个线程,第二运行时包括仅能够被其对应的线程调用的第二对象。
关于基于本公开的虚拟机实例的实现装置700构造的虚拟机实例的架构可以参见上文图1所示。并且,所构建的虚拟机实例可以执行本公开的程序运行方法。
【计算设备】
图7示出了根据本公开一实施例的计算设备的结构示意图。其中,计算设备800可以是可以实施为各种类型的计算装置,例如台式机、便携式计算机、平板电脑、智能手机、个人数据助理(PDA),或者其它类型的计算机装置,但是不限于任何特定形式。其中计算设备800的操作系统可以是IOS、Android、AliOS等操作系统。
如图7所示,本公开的计算设备800可以包括处理器810以及存储器820。处理器810可以是一个多核的处理器,也可以包含多个处理器。在一些实施例中,处理器810可以包含一个通用的主处理器以及一个或多个特殊的协处理器,例如图形处理器(GPU)、数字信号处理器(DSP)等等。在一些实施例中,处理器810可以使用定制的电路实现,例如特定用途集成电路(Application Specific Integrated Circuit,ASIC)或者现场可编程逻辑门阵列(Field Programmable Gate Arrays,FPGA)。
存储器820可以包括各种类型的存储单元,例如系统内存、只读存储器(ROM),和永久存储装置。其中,ROM可以存储处理器810或者计算机的其它模块需要的静态数据或者指令。永久存储装置可以是可读写的存储装置。永久存储装置可以是即使计算机断电后也不会失去存储的指令和数据的非易失性存储设备。在一些实施方式中,永久性存储装置采用大容量存储装置(例如磁或光盘、闪存)作为永久存储装置。另外一些实施方式中,永久性存储装置可以是可移除的存储设备(例如软盘、光驱)。系统内存可以是可读写存储设备或者易失性可读写存储设备,例如动态随机访问内存。系统内存可以存储一些或者所有处理器在运行时需要的指令和数据。此外,存储器820可以包括任意计算机可读存储媒介的组合,包括各种类型的半导体存储芯片(DRAM,SRAM,SDRAM,闪存,可编程只读存储器),磁盘和/或光盘也可以采用。在一些实施方式中,存储器820可以包括可读和/或写的可移除的存储设备,例如激光唱片(CD)、只读数字多功能光盘(例如DVD-ROM,双层DVD-ROM)、只读蓝光光盘、超密度光盘、闪存卡(例如SD卡、min SD卡、Micro-SD卡等等)、磁性软盘等等。计算机可读存储媒介不包含载波和通过无线或有线传输的瞬间电子信号。
在本发明实施例中,存储器820上存储有可执行代码,处理器810可以执行存储在存储器820上的可执行代码。当可执行代码被处理器810执行时,可以使处理器810执行本公开的程序运行方法或虚拟机实例的实现方法。其中,存储器820上除了存储可执行代码,还可以存储处理器810在执行本公开的方法过程中所需的部分或所有数据。
综上,本公开重新设计了一种单实例多线程的虚拟机(可以是JS虚拟机)架构,从而实现了内存占用更少、启动时间更快,传输交互效率更高的工作线程(Worker Thread)。
本公开通过重新设计虚拟机的架构并实现多线程编程接口——Worker,共享部分虚拟机的部分内部基础设施和实现以及用户可见的不可变对象,可以保持用户可见数据在各个线程之间的隔离性,并且在保证多任务之间保持高效通信时间的前提下,比业界既有的实现方案更加节省内存开销和运行开销。
具体来说,在现有的多线程多实例的实现下,线程间传输对象的时候,由于线程间没有JS层的共享,所有传输的对象需要序列化和反序列化重新创建的过程。而在本公开的单实例多线程的实现下,基本类型的对象是不可变的共享对象,可以在多线程之间直接使用,不需要序列化和反序列化的流程,整体传输效率显然会更高。经过试验,在同样环境的某款设备上,传输持有1024个number的对象时,本方案可以节省40%的传输时间。
目前,浏览器的Web Worker实现是基于当前JavaScript虚拟机的架构,采用一个线程单独包含一个虚拟机实例的方式来实现多任务。基于本公开虚拟机实例实现方案可以对JavaScript虚拟机进行底层改造,因此浏览器的Web Worker也可以基于本公开来实现以获得更好性能。
在多线程Worker这个应用场景下,本公开提出的解决方案对比传统的方案,可以节省运行空间,节省运行开销,加快Worker启动时间。与现有方案相比,至少可以产生如下有益效果。
1.本公开在业界传统Worker多线程多虚拟机运行时的情况下,提出了GlobalRuntime加上Multi-Local-Runtime的架构方案。把虚拟机运行时以及虚拟机基础设施中可以共享的部分放置在Global Runtime中管理,线程的非共享部分放置在Local Runtime中管理,比传统的方案达到节省内存空间的效果。
2.本公开的Global Object和Local Object体系中,Global Object是可以在多个线程间(例如全局)共享使用的。在实际JS应用的统计中,我们发现字符串对象和共享方法信息对象的占比比较高,而在本公开的方案中,这两种对象的相当一部分被设计成了Global Object。
经过试验,在某一款设备上的Node.js环境下运行一个空载的Worker,基于本公开提出的方案要比传统方案节省60%以上的内存空间(6M减少到2M)。
3.在本公开中,JS方法的字节码在各线程中间是共享的,针对使用同一份源码的情况,除了节省内存之外,还可以避免了重复解析和编译的时间开销,节省程序运行开销和功耗。
经过试验,在某一款设备上同样条件下在Node.js环境(基于V8引擎的JS运行环境)下,基于本公开的程序运行方法运行启动时间与传统方案相比,可以减少70%以上(600ms减少到170ms)。
4.基于本公开在多线程虚拟机的实现中提出的Global Heap加Multi-Local-Heap的架构设计。在执行针对一个线程的Local GC时,其他线程还是可以继续正常运行的。通过Heap对象的特性和GC策略的调整,大部分情况下触发的是Local GC,不会造成全局停顿。
在不基于特殊硬件支持的情况下,目前,JS虚拟机尚无多线程版本的实现,而传统高级语言的多线程虚拟机实现,GC一般都需要一段时间停止所有运行线程。本公开在Heap架构和GC算法满足多线程Worker这个场景的需求下,大幅改善了停顿时间这个GC衡量指标。
最后需要说明的是,基于本公开可以在JavaScript虚拟机中设计和实现了适用于Web Worker的单实例多线程的JS虚拟机架构,但本公开的方案的设计与创新也不限于用于实现Web Worker标准,本公开适用于任一支持全局数据隔离的线程模型的高级语言虚拟机。
上文中已经参考附图详细描述了根据本发明的程序运行及虚拟机实例实现方法、装置及设备。
此外,根据本发明的方法还可以实现为一种计算机程序或计算机程序产品,该计算机程序或计算机程序产品包括用于执行本发明的上述方法中限定的上述各步骤的计算机程序代码指令。
或者,本发明还可以实施为一种非暂时性机器可读存储介质(或计算机可读存储介质、或机器可读存储介质),其上存储有可执行代码(或计算机程序、或计算机指令代码),当所述可执行代码(或计算机程序、或计算机指令代码)被电子设备(或计算设备、服务器等)的处理器执行时,使所述处理器执行根据本发明的上述方法的各个步骤。
本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。
附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

Claims (29)

1.一种程序运行方法,其特征在于,包括:
维护第一运行时,所述第一运行时包括能够被至少两个线程调用的第一对象,所述第一对象仅能够引用所述第一运行时中的其它对象;所述第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息;以及
响应于线程被创建,维护对应于所述线程的第二运行时,所述第二运行时包括仅能够被所述线程调用的第二对象,所述第二对象能够引用所述第一对象以及与所述第二对象属于同一第二运行时中的其它对象;所述第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被所述线程调用的私有方法信息。
2.根据权利要求1所述的程序运行方法,其特征在于,
所述第一对象为生命周期中不可变和/或不易改变的对象。
3.根据权利要求2所述的程序运行方法,其特征在于,
所述第一对象包括基本类型对象和/或虚拟机内部对象。
4.根据权利要求3所述的程序运行方法,其特征在于,
所述虚拟机内部对象包括与代码相关的虚拟机内部对象和/或用户不可见的虚拟机内部的数据对象。
5.根据权利要求2所述的程序运行方法,其特征在于,所述第一对象包括以下一项或多项:
字符串对象;
数值对象;
脚本对象;
共享方法信息;
共享方法信息缓存池;
代码对象;
不可变对象的布局描述。
6.根据权利要求1所述的程序运行方法,其特征在于,还包括:
针对一个对象,将所述对象中能够被至少两个线程调用的部分作为所述第一对象,并且/或者,将所述对象中仅与单个线程相关的部分作为所述第二对象。
7.根据权利要求1所述的程序运行方法,其特征在于,
所述第一运行时还包括解析器、编译器以及解释执行引擎,并且/或者,
所述第二运行时还包括编译器。
8.根据权利要求1所述的程序运行方法,其特征在于,还包括:
在要执行的方法属于所述第一对象的情况下,通过在所述第一方法缓存池中查找,来确定所述方法是否被编译;
在所述方法被编译过的情况下,从所述第一方法缓存池中获取与所述方法对应的编译后的代码,并运行所获取的代码。
9.根据权利要求8所述的程序运行方法,其特征在于,还包括:
在所述方法未被编译过的情况下,对所述方法进行编译,并将编译结果放入所述第一方法缓存池。
10.根据权利要求1所述的程序运行方法,其特征在于,还包括:
在要执行的方法属于所述第二对象的情况下,通过在所述第二方法缓存池中查找,来确定所述方法是否被编译;
在所述方法被编译过的情况下,从所述第二方法缓存池中获取与所述方法对应的编译后的代码,并运行所获取的代码。
11.根据权利要求10所述的程序运行方法,其特征在于,还包括:
在所述方法未被编译过的情况下,对所述方法进行编译,并将编译结果放入所述第二方法缓存池。
12.根据权利要求1所述的程序运行方法,其特征在于,
所述第一运行时还包括第一内存堆,用于存储所述第一对象,并且/或者
所述第二运行时还包括第二内存堆,用于存储所述第二对象。
13.根据权利要求12所述的程序运行方法,其特征在于,
所述第一运行时还包括第一对象缓存池,用于缓存一个或多个已分配内存的第一对象,并且/或者
所述第二运行时还包括第二对象缓存池,用于缓存一个或多个已分配内存的第二对象。
14.根据权利要求13所述的程序运行方法,其特征在于,还包括:
在申请分配内存的对象属于第一对象的情况下,查找所述第一对象缓存池中是否存在与申请分配内存的对象相匹配的对象;
在所述第一对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,返回相匹配的对象。
15.根据权利要求14所述的程序运行方法,其特征在于,还包括:
在所述第一对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从所述第一内存堆中分配内存,并在分配成功后,将所述对象放入所述第一对象缓存池。
16.根据权利要求13所述的程序运行方法,其特征在于,还包括:
在申请分配内存的对象属于第二对象的情况下,查找所述第二对象缓存池中是否存在与申请分配内存的对象相匹配的对象;
在所述第二对象缓存池中存在与申请分配内存的对象相匹配的对象的情况下,则返回相匹配的对象。
17.根据权利要求16所述的程序运行方法,其特征在于,还包括:
在所述第二对象缓存池中不存在与申请分配内存的对象相匹配的对象的情况下,从所述第二内存堆中分配内存,并在分配成功后,将所述对象放入所述第二对象缓存池。
18.根据权利要求12所述的程序运行方法,其特征在于,
所述第一运行时还包括第一回收器,并且/或者,
所述第二运行时还包括第二回收器。
19.根据权利要求18所述的程序运行方法,其特征在于,还包括:
在所述第二内存堆的可用内存不足的情况下,所述第二回收器回收所述第二内存堆中活跃度低的对象所占用的内存。
20.根据权利要求19所述的程序运行方法,其特征在于,
所述第二回收器将所述第二内存堆中的活跃对象引用到的第二对象标记为活跃对象,直至没有新的活跃对象,并回收所述第二内存堆中未标记的对象所占用的内存。
21.根据权利要求19所述的程序运行方法,其特征在于,还包括:
在所述第二回收器执行回收操作后,所述第二内存堆的可用内存仍不足的情况下,判断所述第一内存堆中是否有可用内存;
在判定所述第一内存堆中有可用内存的情况下,从所述第一内存堆中分配内存。
22.根据权利要求18所述的程序运行方法,其特征在于,还包括:
在所述第一内存堆的可用内存不足的情况下,所述第一回收器以及所有的所述第二回收器分别回收所述第一内存堆以及所有的所述第二内存堆中活跃度低的对象所占用的内存。
23.根据权利要求22所述的程序运行方法,其特征在于,
所述第一回收器以及所有的所述第二回收器分别将所述第一内存堆以及所有的第二内存堆中的活跃对象引用到的对象标记为活跃对象,直至没有新的活跃对象,并回收未标记的对象所占用的内存。
24.一种虚拟机实例的实现方法,其特征在于,包括:
维护第一运行时和一个或多个第二运行时,
所述第一运行时包括能够被运行在所述虚拟机实例中的至少两个线程调用的第一对象,所述第一对象仅能够引用所述第一运行时中的其它对象,所述第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息;
一个所述第二运行时对应一个所述线程,所述第二运行时包括仅能够被其对应的线程调用的第二对象,所述第二对象能够引用所述第一对象以及与所述第二对象属于同一第二运行时中的其它对象;所述第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被所述线程调用的私有方法信息。
25.根据权利要求24所述的虚拟机实例的实现方法,其特征在于,
所述虚拟机实例执行根据权利要求1至23中任何一项所述的程序运行方法。
26.一种程序运行装置,其特征在于,包括:
第一维护模块,用于维护第一运行时,所述第一运行时包括能够被至少两个线程调用的第一对象,所述第一对象仅能够引用所述第一运行时中的其它对象;所述第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息;以及
第二维护模块,用于响应于线程被创建,维护对应于所述线程的第二运行时,所述第二运行时包括仅能够被所述线程调用的第二对象,所述第二对象能够引用所述第一对象以及与所述第二对象属于同一第二运行时中的其它对象;所述第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被所述线程调用的私有方法信息。
27.一种虚拟机实例的实现装置,其特征在于,包括:
第一维护装置,用户维护第一运行时;以及
第二维护装置,用于维护一个或多个第二运行时,
所述第一运行时包括能够被运行在所述虚拟机实例中的至少两个线程调用的第一对象,所述第一对象仅能够引用所述第一运行时中的其它对象,所述第一运行时还包括第一方法缓存池,用于缓存编译好的能够被至少两个线程调用的共享方法信息;
一个所述第二运行时对应一个所述线程,所述第二运行时包括仅能够被其对应的线程调用的第二对象,所述第二对象能够引用所述第一对象以及与所述第二对象属于同一第二运行时中的其它对象;所述第二运行时还包括第二方法缓存池,用于缓存编译好的仅能够被所述线程调用的私有方法信息。
28.一种计算设备,其特征在于,包括:
处理器;以及
存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1-25中任何一项所述的方法。
29.一种非暂时性机器可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如权利要求1至25中任一项所述的方法。
CN201810049908.XA 2018-01-18 2018-01-18 程序运行及虚拟机实例的实现方法、装置、设备及介质 Active CN110058859B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201810049908.XA CN110058859B (zh) 2018-01-18 2018-01-18 程序运行及虚拟机实例的实现方法、装置、设备及介质
PCT/CN2019/070807 WO2019141107A1 (zh) 2018-01-18 2019-01-08 程序运行及虚拟机实例的实现方法、装置、设备及介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810049908.XA CN110058859B (zh) 2018-01-18 2018-01-18 程序运行及虚拟机实例的实现方法、装置、设备及介质

Publications (2)

Publication Number Publication Date
CN110058859A CN110058859A (zh) 2019-07-26
CN110058859B true CN110058859B (zh) 2023-09-08

Family

ID=67302008

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810049908.XA Active CN110058859B (zh) 2018-01-18 2018-01-18 程序运行及虚拟机实例的实现方法、装置、设备及介质

Country Status (2)

Country Link
CN (1) CN110058859B (zh)
WO (1) WO2019141107A1 (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112473128B (zh) * 2020-11-24 2023-12-26 杭州电魂网络科技股份有限公司 隔离游戏逻辑的方法、装置、电子设备和存储介质
CN112817769B (zh) * 2021-03-05 2024-05-28 网易(杭州)网络有限公司 游戏资源动态缓存方法、装置、存储介质与电子设备

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1989486A (zh) * 2004-05-20 2007-06-27 Sap股份公司 在运行时系统中共享对象
CN1989489A (zh) * 2004-05-20 2007-06-27 Sap股份公司 在运行时系统中共享对象
CN1989488A (zh) * 2004-05-20 2007-06-27 Sap股份公司 运行时系统的鲁棒共享
CN101515248A (zh) * 2008-02-21 2009-08-26 国际商业机器公司 面向对象程序的跟踪方法和系统
US20120110573A1 (en) * 2010-11-03 2012-05-03 International Business Machines Corporation Transferring objects between virtual machines
CN102508715A (zh) * 2011-11-23 2012-06-20 北京地拓科技发展有限公司 一种基于多线程的对象调用方法和装置
CN102591710A (zh) * 2010-12-16 2012-07-18 微软公司 共享对象表示
CN104219078A (zh) * 2013-06-04 2014-12-17 阿里巴巴集团控股有限公司 一种多运行时环境数据的处理方法和装置
CN107562516A (zh) * 2017-08-07 2018-01-09 北京金山安全管理系统技术有限公司 多线程处理方法和装置、存储介质及处理器

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2003040919A2 (en) * 2001-11-07 2003-05-15 Sap Aktiengesellschaft Providing isolation through process attachable virtual machines
US7908610B2 (en) * 2007-07-31 2011-03-15 Microsoft Corporation Multi-threaded business programming library

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1989486A (zh) * 2004-05-20 2007-06-27 Sap股份公司 在运行时系统中共享对象
CN1989489A (zh) * 2004-05-20 2007-06-27 Sap股份公司 在运行时系统中共享对象
CN1989488A (zh) * 2004-05-20 2007-06-27 Sap股份公司 运行时系统的鲁棒共享
CN101515248A (zh) * 2008-02-21 2009-08-26 国际商业机器公司 面向对象程序的跟踪方法和系统
US20120110573A1 (en) * 2010-11-03 2012-05-03 International Business Machines Corporation Transferring objects between virtual machines
CN102591710A (zh) * 2010-12-16 2012-07-18 微软公司 共享对象表示
CN102508715A (zh) * 2011-11-23 2012-06-20 北京地拓科技发展有限公司 一种基于多线程的对象调用方法和装置
CN104219078A (zh) * 2013-06-04 2014-12-17 阿里巴巴集团控股有限公司 一种多运行时环境数据的处理方法和装置
CN107562516A (zh) * 2017-08-07 2018-01-09 北京金山安全管理系统技术有限公司 多线程处理方法和装置、存储介质及处理器

Also Published As

Publication number Publication date
CN110058859A (zh) 2019-07-26
WO2019141107A1 (zh) 2019-07-25

Similar Documents

Publication Publication Date Title
US7089272B1 (en) Specializing write-barriers for objects in a garbage collected heap
US7404182B1 (en) Deferring and combining write barriers for a garbage-collected heap
US9923840B2 (en) Improving performance and security of multi-processor systems by moving thread execution between processors based on data location
US6999980B2 (en) Eliminating write barriers for young objects
US7143124B2 (en) Detection of dead regions during incremental collection
US7225439B2 (en) Combining write-barriers within an inner loop with fixed step
Nguyen et al. Skyway: Connecting managed heaps in distributed big data systems
CN102693188B (zh) 用于在可控运行时环境中进行基于硬件的动态逸出检测的方法和装置
US8621443B2 (en) Processor emulation using speculative forward translation
US20040054517A1 (en) Method and system for multiprocessor emulation on a multiprocessor host system
US20020032719A1 (en) Method and system of dynamic memory management
US20180101483A1 (en) Memory Structure Comprising Scratchpad Memory
KR101976221B1 (ko) 수정되지 않은 애플리케이션을 위한 메모리 관리 모델 및 인터페이스
US8473900B2 (en) Combining classes referenced by immutable classes into a single synthetic class
US7596569B2 (en) Method and program for space-efficient representation of objects in a garbage-collected system
US9262332B2 (en) Memory management with priority-based memory reclamation
US20040186863A1 (en) Elision of write barriers for stores whose values are in close proximity
US20060212468A1 (en) Method and system for global constant management
CN110058859B (zh) 程序运行及虚拟机实例的实现方法、装置、设备及介质
US6581077B2 (en) Method and apparatus for storing short-lived objects in a virtual machine
US6965905B2 (en) Lock-free, parallel remembered sets
CN103092618A (zh) 基于软件Cache的Dalvik虚拟机JIT加速方法
Krylov et al. The evolution of garbage collection in v8: google's javascript engine
Onozawa et al. Fusuma: double-ended threaded compaction
US10936483B2 (en) Hybrid garbage collection

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40011344

Country of ref document: HK

TA01 Transfer of patent application right

Effective date of registration: 20201124

Address after: Room 603, 6 / F, Roche Plaza, 788 Cheung Sha Wan Road, Kowloon, China

Applicant after: Zebra smart travel network (Hong Kong) Ltd.

Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands

Applicant before: Alibaba Group Holding Ltd.

TA01 Transfer of patent application right
GR01 Patent grant
GR01 Patent grant