CN109154908B - 具有精确垃圾收集报告的动态大小的局部 - Google Patents
具有精确垃圾收集报告的动态大小的局部 Download PDFInfo
- Publication number
- CN109154908B CN109154908B CN201780029685.4A CN201780029685A CN109154908B CN 109154908 B CN109154908 B CN 109154908B CN 201780029685 A CN201780029685 A CN 201780029685A CN 109154908 B CN109154908 B CN 109154908B
- Authority
- CN
- China
- Prior art keywords
- stack
- code
- local data
- generic
- computing device
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0238—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44557—Code layout in executable memory
- G06F9/44563—Sharing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1024—Latency reduction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1041—Resource optimization
- G06F2212/1044—Space efficiency improvement
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/45—Caching of specific data in cache memory
- G06F2212/451—Stack data
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Stored Programmes (AREA)
Abstract
生成全局共享的通用代码的实例。运行时参数使得能够确定可以在其上存储局部数据的堆栈帧的大小。可以将动态大小的局部存储在堆栈中,从而实现精确的垃圾收集报告。为每个代码段分配一个堆栈帧以简化GC报告。帧存储器区域中的报告区域包括局部的计数和该局部在堆栈中被找到的位置。
Description
背景技术
在计算机科学领域中,垃圾收集(GC)是自动存储器管理的一种形式,其中垃圾收集器查找并回收由执行程序不再使用的数据所占用的存储器。垃圾收集会消耗大量的处理资源,并且因此对性能会产生重大的影响。垃圾收集的优点包括但不限于以下内容。程序员不需要明确地对存储器解除分配,从而消除或大大减少了与这些活动相关联的编程错误类型。
另外,利用GC可以避免某些类型的存储器泄漏。例如,当被无法访问的对象占用的存储器变得不可用时,会发生存储器泄漏。但是,因为由垃圾收集器确定要释放哪个存储器,所以会招致开销,这会导致性能下降或不均。通常需要附加的存储器来补偿GC开销,以便程序能够像在执行显式存储器管理时那样快地执行。在实际收集垃圾时可能会发生程序执行中的暂停。在执行某些任务时,这些暂停可能是不可接受的。
发明内容
可以在堆栈上而不是在GC堆上动态地分配用于局部数据的存储器空间,从而可以向垃圾收集器报告关于数据何时可以被垃圾收集以及数据位于何处的精确信息。精确GC意味着在GC堆上仅保留将来被实际使用的那些项。精确的GC报告意味着垃圾收集器被明确告知存储器中何时何地可以对局部数据进行垃圾收集。全局共享的通用代码的代码生成和运行时行为可以支持精确的GC报告,并可以提高应用的性能。
作为在GC堆上为局部数据分配存储器的替代,局部数据可以被存储在堆栈上。有关局部数据的附加信息也可以被存储在堆栈中,使得诸如但不限于GC报告过程之类的过程可以准确地执行GC报告。程序中的每个代码段(例如,函数、方法或子例程等)可以在堆栈上被指派其自己的帧(针对每个代码段一个帧)。在堆栈上分配的帧的大小可以基于与数据相关联的动态确定的类型描述而变化。可以将通用源代码编译为全局共享的通用代码的单个实例,其在运行时的行为取决于在运行时接收的通用上下文参数。全局共享的通用代码的单个实例可以被用于通用代码的所有可能实例化。可以在编译时生成全局共享的通用代码,从而消除了对于在运行时进行JIT编译的需要。在运行时指定的参数(例如,通用上下文参数)可以被用来影响全局共享的通用可执行代码的单个实例的行为。当被执行时,全局共享的通用可执行代码可以动态地确定局部数据所需的堆栈帧的大小,分配堆栈帧,在堆栈上存储局部数据并存储局部数据的描述,使得后续过程可以执行精确的GC报告。
提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
附图说明
在附图中:
图1a是表示本领域中已知的在编译时的通用代码共享的框图103;
图1b是表示本领域中已知的在运行时的通用代码共享的框图105;
图1c是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的在编译时全局共享的通用代码共享的示例的框图150;
图1d是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的在运行时全局共享的通用代码共享的示例的框图160;
图1e是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的编译时***的示例的框图100;
图1f是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的运行时***的示例的框图101;
图2a图示出了根据本文所描述的主题的各方面的用于精确垃圾收集报告的编译时方法的示例200;
图2b图示出了根据本文所描述的主题的各方面的用于精确垃圾收集报告的运行时方法的示例220;
图3是根据本文所描述的主题的各方面的计算环境的示例的框图;和
图4是根据本文所描述的主题的各方面的集成开发环境的示例的框图。
具体实施方式
概述
当以某些编程语言(诸如但不限于C#、Swift、Rust和Java)开发应用时,编写在编译时可以采取不同类型参数的通用代码是可能的。为特定通用代码片的不同实例化所生成的可执行代码可以取决于什么类型的参数被提供给通用代码而不同。然而,如果类型参数在它们的数据表示中是相似的,则在具有相似数据表示的代码的多个实例之间共享代码是可能的。
通用代码共享的一些实现局限于引用类型实例化。例如,编程语言C#中的引用类型实例化的示例以下代码,该代码将字符串项添加到字符串列表的代码和将字符串项添加到节点处的字符串列表。“字符串”(string)和“节点”(node)都是“引用类型”,也就是说,当被存储到函数的局部变量中时,存储在局部变量中的实际数据是对存储器中存储值的位置的引用,而不是实际值。也就是说,例如,将对对象的内容的引用作为指针存储在本地存储器中,而不是将对象的内容(值)复制到局部变量中。可以通过生成和使用可以被共享的通用代码来利用代码中诸如此类的相似性。也就是说,可以反复使用相同的代码,以基于在编译时期间被传递给通用代码的不同参数来产生不同的结果。通用代码共享可以使可执行文件(例如,本机机器代码)的大小更小并且可以使代码的服务(更新)更容易,因为只有通用代码所在的程序模块必须被改变。
当一段相同的共享通用代码可以被用于所有可能的数据类型时,该代码被称为“全局共享的通用代码”。对于通用代码的所有实例化,全局共享的通用代码是“全局”共享的。本文所描述的全局共享的通用代码共享适用于通用代码的所有实例化,包括但不限于值类型实例化。当代码被编译成机器可读代码段时,必须跟踪在源代码中定义临时数据(也被称为“局部变量”或就称为“局部”)的方式。临时数据的类型(诸如但不限于变量或对象)可以基于全局共享的通用代码在运行时所接收的一个或多个参数而变化。在所有实例化之间共享代码的一个因素是处理不同大小的值类型。另一个因素涉及可以如何容易地识别与GC相关的存储器。另一个相关因素是运行时性能。本文所描述的主题至少解决了这些因素。
共享代码可以影响运行时性能。在某些情形中,由于性能问题等原因,不希望在应用运行时运行即时(JIT)编译器。即时编译器动态地生成平台特定或机器特定的可执行代码(同时程序正在执行)。生成“全局共享的通用”版本的通用代码可以消除对JIT编译的需要。因为可以动态地生成运行时参数而不必在编译时被知晓,全局共享的通用代码消除了对JIT编译的需要。虽然可以在编译时知晓运行时参数的一些可能值,但在使用全局共享的通用代码时,不需要知晓对于完整的可能运行时参数集的值。在某些情况下,全局共享的通用代码可以在运行时采取额外的“通用上下文”参数。通用上下文参数可以动态地确定全局共享的通用可执行代码的单个实例在全局共享的通用可执行文件的该特定执行中如何表现。
根据本文所描述的主题的一些方面,对于动态创建的通用类型,可以在运行时使用由静态编译器使用的相同算法根据与本机布局相关联的预处理的元数据(例如,在编译时处理的元数据)计算出字段布局和实例大小。如果字段布局受到被提供给全局共享的通用可执行代码的一个或多个参数的类型的影响,则访问字段的全局共享的通用可执行代码可以经由字典查找来计算出受影响字段的偏移。在某些情况下,运行时通用上下文参数的类型将不会影响字段布局。
全局共享的通用代码的使用可以解决由于可以在运行时提供不同参数而导致的行为差异。非限制性示例是通用上下文参数类型的值的大小。例如,“double”可能需要8个字节的数据储存,而布尔值或“bool”可能只需要1个字节。如果局部数据包括其类型涉及通用上下文参数类型的变量,则局部变量的大小可以取决于替换(多个)通用上下文参数的特定类型而变化。这解释了为什么针对参考类型的通用代码共享是一个简单直接的任务。引用类型是指针。无论被引用的数据类型如何,所有指针的大小都是相同的。因此,即使某些局部的类型是依赖于通用上下文参数,针对这种共享通用代码的堆栈帧大小在编译时可以被固定。堆栈帧是由特定代码段的特定激活所保留的以供其专用的堆栈区域,通常用于存储诸如变量或对象之类的局部数据。堆栈是保持数据元素集合的一种抽象数据类型。一个堆栈操作是push,它向集合添加一个元素,另一个是pop,它移除仍堆栈中最近添加的元素。元素从堆栈中出来的顺序被称为LIFO(后进先出)。
通用代码的已知实现依靠于在GC堆上为所有可变大小的局部数据分配独立的对象。这种方法可以在针对代码段的编译时保持堆栈帧大小固定,其简化了堆栈布局。通过在编译时被固定,运行时大小也被固定并且不能基于类型参数而变化。为GC堆上的局部分配空间通常增加了处理资源的使用,因为例如GC必须确定在空间可以被回收之前不再引用被分配的对象或变量(以包含局部变量的值),人为地延长了这些值的生命周期(其只有它们所属的函数或子程序正在执行时才会保持活动状态)。使用可变大小的堆栈分配来在堆栈上对它们进行分配的方法具有以下优点:允许在代码段完成时移除值、减少GC必须执行的工作量以及更有效地使用存储器。
根据本文所描述的主题的各方面,代码生成机制可以在编译时产生单个全局共享的通用可执行代码片,其当在运行时被执行时,可以在堆栈上为以下局部数据分配空间,该局部数据与全局共享的通用代码的特定实例化相关联。局部数据的大小可以变化,并且因此在运行时分配的堆栈帧的大小可以相应地变化。如果局部数据的大小受运行时接收到的通用上下文(类型)参数的影响,则在编译时无法确定存储局部数据在运行时所需堆栈空间的量。在这种情况下,可以在运行时分配适当大小的存储器块,并且可以将块标识为与GC相关。根据本文所描述的主题的一些方面,可以在后台操作的代码生成器可以生成以下代码,其用于在运行时在堆栈上分配可变大小的区域。代码生成器可以基于通用上下文参数来确定函数的局部变量的大小。通用上下文参数是向代码生成器描述通用代码的当前实例化的细节的数据。
此外,可以将信息存储在堆栈帧中,其中堆栈帧描述每个堆栈分配的局部的位置和特定类型,以便允许GC高效且正确地确定任何对象引用位于堆栈的该可变大小(和可变类型)的区域中的何处。可以经由指令(诸如但不限于伪操作之类)或者通过任何其他合适的机制来传送信息。
具有精确垃圾收集报告的动态大小的局部
图1a是表示在本领域中已知的在编译时的通用代码共享的框图103。在图1a中,通用源代码(诸如通用源代码113)和第一编译时参数(诸如编译时参数1115)可以由编译链(诸如编译链119)接收。可以生成第一可执行文件(executable),诸如可执行文件1 121。例如,如上面更全面地描述的,第一编译时参数可以是指示待生成的可执行文件(例如,可执行文件1 112)将字符串添加到字符串列表的参数。类似地,通用源代码113和第二编译时参数(诸如编译时参数2 117)可以由编译链119接收,并且可以生成第二可执行文件(诸如可执行文件2 123)。第二编译时参数可以是诸如编译时参数2 117之类的参数,其指示待生成的可执行文件将字符串添加到在节点处的字符串列表,如上面更全面地描述的。应当理解,尽管相同的通用源代码被使用,但是可以产生代码的不同实例化,不同实例化是不同的(例如,可执行文件1 121和可执行文件2 123不相同:一个将字符串添加到字符串列表,以及一个将字符串添加到在节点处的字符串列表)。也就是说,尽管从中生成可执行文件的代码是相同的(通用的),但是第一可执行文件(可执行文件1 112)与第二可执行文件(可执行文件2 123)是不同的。
可执行文件1 112和可执行文件2 123是引用类型实例化的示例。“string”和“node”都是“引用类型”,也就是说,当可执行文件执行时,在堆栈上存储的局部变量中存储的实际数据是指向存储器中存储值的位置的引用或指针,而不是存储在局部变量中的实际值。因为所有指针是相同的大小,所以在编译时可以计算出存储局部变量所需堆栈的大小。
图1b是表示图1a中生成的可执行文件的执行的框图105。通用源代码113和编译时参数1 115在每次被编译时,堆栈帧大小计算将产出相同的结果(例如,堆栈帧大小为x)。通用源代码113和编译时参数2 117在每次被编译时,堆栈帧大小计算将产出相同的结果(例如,堆栈帧大小为y),其中x不一定与y相同。在图1b中每次执行可执行文件1112时,堆栈(诸如堆栈125)包括诸如堆栈帧1到n之类的堆栈帧(例如,堆栈帧125a...堆栈帧125n)。对于可执行文件1 121中的每个函数等,可以分配大小为x的固定大小的帧,诸如例如堆栈125上的堆栈帧125x,其中用于可执行文件1 121的堆栈帧中的条目指向GC堆(诸如GC堆127)中的位置(例如,对象)。类似地,每次执行可执行文件2 123时,堆栈(诸如堆栈131)包括诸如堆栈帧1到堆栈帧n之类的堆栈帧(例如,堆栈帧131a...堆栈帧131n)。对于可执行文件2 123中的每个函数等等,可以分配大小为y的固定大小的帧,诸如例如堆栈131上的堆栈帧131y,其中用于可执行文件2 123的堆栈帧中的条目指向GC堆(诸如GC堆133)中的位置(例如,对象)。应当理解,与可执行文件1 121相关联的(多个)堆栈帧可以位于堆栈125上的任何位置。类似地,与可执行文件2 123相关联的(多个)堆栈帧可以位于堆栈131上的任何位置。
图1c是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的全局共享的通用代码在编译时生成的示例的框图150。在图1c中,通用源代码(诸如通用源代码152)可以由编译链(诸如编译链154)接收。根据本文所描述的主题的一些方面,没有向编译链154提供用于通用源代码152的类型参数。可以生成元数据,诸如元数据176。可以生成单个可执行文件,诸如可执行文件156。如上所述,全局共享的可执行文件156可以被用于对应的通用源代码的所有可能实例化。也就是说,全局共享的通用可执行文件156是全局共享的通用代码的示例。应当理解,可以向编译链154提供产生全局共享的通用代码的期望的指示。这样的指示可以是缺少类型参数。
图1d是表示根据本文所描述的主题的各方面的用于图1c中生成的全局共享的通用代码可执行文件的精确垃圾收集报告的全局共享的通用代码可执行文件的示例的框图160。在图1d中,执行全局共享的通用代码(全局共享的通用代码156)的相同实例。在第一执行(诸如执行185)中,全局共享的通用代码156可以接收运行时通用上下文参数(诸如运行时GC参数1 164)。可以通过全局共享的通用代码156来访问与全局共享的通用代码156相关联的元数据(诸如元数据177)。根据此信息,可以动态地确定存储局部变量所需的堆栈帧的大小。全局共享的通用代码156可以为堆栈170上的代码段分配堆栈帧SFU1 171,并且可以存储局部数据和描述局部数据的信息,其使得在堆栈帧SFU1 171上的GC报告器168能够进行精确的GC报告。全局共享的通用代码156可以将该信息提供给GC报告器168。
在另一个执行(执行2 187)中,全局共享的通用代码156的相同实例可以接收不同的运行时通用上下文参数,诸如运行时GC参数2 182。可以通过全局共享的通用代码156来访问元数据(诸如元数据180)。根据元数据180和运行时GC参数2 182,可以动态地确定为全局共享的通用代码156存储局部变量所需的堆栈帧的大小。可替代地(未示出),全局共享的通用代码的特定化实例可以由后台编译器(未示出)生成,并且特定化实例可以被用来在堆栈上分配和存储局部数据和报告信息。全局共享的通用代码156的相同实例可以为代码段分配堆栈帧SFU2 173,并且可以存储局部数据和描述局部数据的信息,该信息使得堆栈帧SFU2 173上的GC报告器168能够进行精确的GC报告。应当理解,为执行1 185所生成的堆栈帧的大小可以与为执行2 187所生成的堆栈帧的大小不同,因为为执行1 185所生成的堆栈帧的大小是基于运行时通用上下文参数1 164,并且为执行2187所生成的堆栈帧的大小是基于运行时通用上下文参数2 182。因为通用上下文参数2 182可以与运行时通用上下文参数1 164不同,所以堆栈帧SFU1 171和SFU2 173的大小可以不同。换句话说,因为所提供的运行时通用上下文参数不同,全局共享的通用代码的相同实例可以在不同的执行中在运行时表现不同。
图1e是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的编译时***100的框图。***100的全部或各部分可以驻留在一个或多个计算机或计算设备上,诸如下面关于图3所描述的计算机。***100或其各部分可以作为独立***或作为插件或附加件而被提供。***100可以全部或部分地在IDE(诸如IDE 104)内执行,或者可以全部或部分地在IDE外部执行。IDE可以是诸如相关于图4所描述的IDE之类的IDE,或者可以是任何其他IDE。可以将***100的全部或各部分实现为插件或附加件。
***100或其各部分可以包括从服务(例如,在云中)获得的信息,或者可以在云计算环境中运行。云计算环境可以是不拥有计算服务但是按需提供的环境。例如,信息可以驻留在联网云中的多个设备上和/或数据可以被存储在云中的多个设备上。
***100可以包括一个或多个计算设备,诸如例如计算设备102。预期的计算设备包括但不限于:台式计算机、平板计算机、膝上型计算机、笔记本计算机、个人数字助理、智能电话、蜂窝电话、移动电话、服务器、虚拟机、包括数据库的设备、防火墙等。计算设备(诸如计算设备102)可以包括一个或多个处理器(诸如处理器142)以及与一个或多个处理器通信的存储器(诸如存储器144)。
***100可以包括程序模块中的任何一个或任何组合,包括:编译链(诸如编译链106)和/或元数据生成器(诸如元数据生成器110)。元数据生成器可以位于编译链内或者可以在编译链之外(未示出)。编译链106可以接收通用源代码,诸如通用源代码108,并且可以生成全局共享的通用可执行文件114。在编译时,通用源代码(诸如通用源代码108)可以由编译链(诸如编译链106)接收。编译链106可以包括元数据生成器(诸如元数据生成器110)或与之相关联。可以生成单个可执行文件,诸如全局共享的通用可执行文件114。生成的可执行文件可以被用于通用源代码的所有实例化。还可以生成元数据,诸如元数据116。根据本文所描述的主题的一些方面,为所生成的可执行文件所生成的元数据可以是相同的。根据本文所描述的主题的一些方面,为所生成的可执行文件所生成的元数据可以基于特定编译环境而不同。元数据116可以包括信息,该信息包括但不限于可以被用来将在运行时接收的通用上下文参数转换为在运行时为堆栈帧分配多少存储器的信息。元数据可以包括关于在编译时所生成的全局共享的通用可执行代码的信息。
根据本文所描述的主题的一些方面,绑定器(未示出)可以接收(多个)参数和代码,并且可以生成可执行文件和元数据。绑定器可以将文件一起绑定到单个元件中。绑定器可以接收中间代码或机器代码,并且可以通过例如使用诸如伪操作之类的指令来细化机器代码或中间代码。指令可以请求下游处理器以生成机器代码。指令可以跟踪在诸如例如在本地布局中生成了什么机器代码并且可以以特定的格式创建元数据。可以由绑定器接收的伪操作的示例可以包括但不限于以下:
HAS_ALLOCA_BASED_ALLOC_LOCALS*GenericsContext*
这是一个被放置在函数的序言中的指令,其用于指示堆栈上的空间是为局部数据分配的。此伪操作在堆栈帧中生成指针大小的区域,并且可以包括增强的报告行为,其使得能够进行精确的GC报告。
GET_ALLOCA_BASED_ALLOC_LOCAL_SIZE(寄存器)
这是一个可以将需要分配到堆栈上的字节数放置到寄存器中以存储针对此代码段的局部的指令。
INITIALIZE_ALLOCA_BASED_ALLOC_LOCALS(rcx,ecx,r0)这是一个利用指向已分配的存储器区域的指针进行设置的指令。
附加指令包括:
*GenericsContext*
这是一个可以对为局部数据所分配的存储器进行初始化的指令。该指令可以接收指向已分配存储器的指针,并且可以接收通用上下文参数。它可以返回寄存器中所初始化的存储器,诸如但不限于例如诸如rax、eax和r0之类的寄存器。该指令可以清除寄存器,诸如例如存储与调用相关联的信息的那些寄存器。此外,它还可以存储指向用于精确的GC报告的报告区域中的已分配局部的指针。它可以用报头填充已分配的空间。报头可以包括指向各种已分配对象的一系列指针和/或指向局部区域的指针。第一指针大小的区域可以包括局部的计数(堆栈上存储了多少局部变量)。可以使用其EEType作为前缀来分配每个个体局部。实现可以是在辅助调用之后立即经由辅助调用+mov指令。
ALLOCA_ALLOC_LOCAL<reg1><reg2><type token>
这是一个可以为堆栈上的局部变量分配空间的指令。该指令可以接收指向寄存器中初始化的局部存储器的指针,例如reg1(由INITIALIZE_ALLOCA_BASED_ALLOC_LOCALS指令产生),并且可以设置另一个寄存器(诸如例如寄存器2)以包含指向局部的指针。根据本文所描述的主题的一些方面,第二寄存器(例如寄存器2)可以由指令修改。即使在循环中被使用,该指令也可以返回相同的结果。根据本文所描述的主题的一些方面,不将通用上下文参数作为输入。
预期的通用使用模式如下。
...
HAS_ALLOCA_BASED_ALLOC_LOCALS
...
ENDPROLOG
...
GENERICS_CONTEXT rsi,GENERIC_DICT
GET_ALLOCA_BASED_ALLOC_LOCAL_SIZE rax
rcx=Alloca(rax)
GENERICS_CONTEXT rsi,GENERIC_DICT
INITIALIZE_ALLOCA_BASED_ALLOC_LOCALS
ALLOCA_ALLOC_LOCAL rax,rcx T
Mov[ebp+xxx],rcx
ALLOCA_ALLOC_LOCAL rax,rcx MyStruct<T>
Mov[ebp+xxx],rcx
绑定器需要各种信息以能够为使用该技术的方法的堆栈帧设立代码,因此在函数序言结束之前,CODE可以编码标志(HAS_ALLOCA_BASED_ALLOC_LOCALS)。在序言完成之后,代码可以生成在堆栈帧上分配可变大小区域所需的逻辑。这是通过经由GET_ALLOCA_BASED_ALLOC_LOCAL_SIZE指令来获取帧的总变量大小从而完成的。一旦分配了可变大小的区域,就可以经由INITIALIZE_ALLOCA_BASED_ALLOC_LOCALS指令来对其进行初始化。一旦该指令完成,针对可变区域的GC报告将起作用。最后,为了访问用于特定局部的已分配存储器,可以经由ALLOCA_ALLOC_LOCAL访问它。该指令将提供对用于特定局部的存储器的访问。与GET_ALLOCA_BASED_ALLOC_LOCAL_SIZE和INITIALIZE_ALLOC_LOCAL不同。可能存在多个ALLOCA_ALLOC_LOCAL指令。
图1f是表示根据本文所描述的主题的各方面的用于精确垃圾收集报告的运行时***101的框图。***101的全部或各部分可以驻留在一个或多个计算机或计算设备上,诸如下面相关于图3所描述的计算机。***101或其各部分可以作为独立***或作为插件或附加件而被提供。***101可以全部或部分地在IDE内执行或者可以全部或部分地在IDE外部执行。IDE可以是诸如相关于图4所描述的IDE之类的IDE,或者可以是任何其他IDE。可以将***101的全部或各部分实现为插件或附加件。
***101或其各部分可以包括从服务(例如,在云中)获得的信息,或者可以在云计算环境中运行。云计算环境可以是不拥有计算服务但是按需提供的环境。例如,信息可以驻留在联网云中的多个设备上和/或数据可以被存储在云中的多个设备上。
***101可以包括一个或多个计算设备,诸如例如计算设备102。预期的计算设备包括但不限于:台式计算机、平板计算机、膝上型计算机、笔记本计算机、个人数字助理、智能电话、蜂窝电话、移动电话、服务器、虚拟机、包括数据库的设备、防火墙等。计算设备(诸如计算设备102)可以包括一个或多个处理器(诸如处理器142)以及与一个或多个处理器通信的存储器(诸如存储器144)。
***101可以包括程序模块中的任何一个或任何组合,其包括以下中的一个或多个:诸如精确的GC报告器120之类的精确的GC报告器、诸如GC 122之类的GC、诸如GC堆124之类的GC堆、诸如堆栈126之类的堆栈、诸如执行过程130之类的执行过程、诸如在执行过程130中执行的在图1e中生成的全局共享的通用代码114之类的全局共享的通用代码、和/或(一个或多个)通用上下文参数128。在操作中,可以将全局共享的通用可执行代码(诸如全局共享的通用可执行代码114)和元数据116加载到过程130中。可以向全局共享的通用代码114提供运行时通用上下文参数,诸如通用上下文参数128。运行时通用上下文参数可以提供信息,该信息使得全局恭喜的通用代码114能够动态地计算要在堆栈(诸如堆栈126)上分配的堆栈帧的大小,并且分配计算出的大小的堆栈帧(每个代码段一帧)。可以将信息存储在堆栈中,其使得精确的GC报告器(诸如精确的GC报告器)能够向GC(诸如GC 122)报告堆栈中可以进行垃圾收集的区域。
例如,假设将类型T的变量存储在堆栈上。可以在堆栈上分配用于类型T的变量的空间。当类型T是引用类型时,可以将指向变量的位置的指针动态地报告给精确的GC报告器。如果类型T是结构,在其中包含至少一个引用类型字段,则可以报告一个或多个引用类型字段。
图2a图示出了根据本文所描述的主题的各方面的用于精确垃圾收集报告的方法200的示例。虽然方法200描述了以序列执行的一系列操作,但是应该理解,方法200不受所描绘的序列的顺序的限制。例如,某些操作可以按照与所描述的顺序不同的顺序发生。另外,一个操作可以与另一个操作同时发生。在一些实例中,并非描述的所有操作都被执行。在一些实例中,并非执行的所有操作都被图示出。方法200或其各部分可以由***(诸如***100和/或***101)或***的一部分来执行。
在操作202处,通用源代码可以由编译链接收。在操作204处,可以生成包括全局共享的通用代码的可执行文件。在操作206处,可以生成元数据。元数据可以包括可以被用来将在运行时接收的通用上下文类型参数转换为在运行时为堆栈帧分配多少存储器的信息。元数据可以包括关于在操作204处生成的全局共享的通用可执行代码的信息。
图2b图示出了根据本文所描述的主题的各方面的用于精确垃圾收集报告的运行时方法220的示例。虽然方法220描述了以序列执行的一系列操作,但是应该理解,方法220不受所描绘的序列的顺序的限制。例如,某些操作可以按照与所描述的顺序不同的顺序发生。另外,一个操作可以与另一个操作同时发生。在一些实例中,并非描述的所有操作都被执行。在一些实例中,并非执行的所有操作都被图示出。方法220或其各部分可以由***(诸如***100和/或***101)或***的一部分来执行。在操作222处,可以接收通用上下文参数或参数集和元数据,以及致力于对应通用代码的所有可能实例化的全局共享的通用代码的单个实例。可以进行对诸如要被分配的堆栈的大小等等之类的计算。在操作224处,可以根据所接收的一个或多个参数来生成堆栈上的空间。在操作226处,可以在堆栈上存储局部数据。可以在堆栈上存储局部数据的描述。在操作228处,可以向后续(GC报告过程)提供精确的GC报告信息。
本文所描述的是一种计算设备,包括至少一个处理器,连接到至少一个处理器的存储器和至少一个程序模块,所述至少一个程序模块当被加载到存储器中时,使得至少一个处理器执行以下操作:执行适用于对应通用源代码的所有实例化的全局共享的通用代码的单个实例,以:在堆栈上为局部数据分配空间;在堆栈上存储局部数据,其中局部数据的大小可变;在堆栈上存储已存储局部数据的描述;以及向后续过程提供精确的GC报告信息。另外,一个或多个程序模块可以基于包括与局部数据相关联的类型描述的至少一个通用上下文参数来动态地确定堆栈帧的大小以为局部数据进行分配。另外,一个或多个程序模块可以在运行时接收至少一个通用上下文参数。另外,一个或多个程序模块可以在运行时接收至少一个通用上下文参数,根据该参数确定要被创建的堆栈帧的大小。另外,一个或多个程序模块可以使用可变大小的堆栈分配在堆栈上分配局部数据。另外,一个或多个程序模块可以告知后续过程,哪里可以找到用于垃圾收集的局部数据。另外,一个或多个程序模块可以在堆栈上为与全局共享的通用代码的特定执行相关联的局部数据分配空间。分配的空间堆栈帧的大小根据局部数据的大小而变化。本文所描述的是一种执行精确的GC报告的方法,包括:由计算设备的处理器在运行时接收全局共享的通用代码和通用上下文参数,并基于通用上下文参数生成包括机器代码的全局共享的通用代码的实例,实例特定的机器代码在运行时期间将局部数据存储在堆栈上而不是在GC堆上。可以基于类型描述来确定堆栈的大小。可以接收包括针对要被存储在堆栈上的局部数据的类型描述的通用上下文参数。可以接收在运行时的通用上下文参数,根据该参数动态地确定堆栈大小。本文所描述的是包括至少一个处理器、连接到所述至少一个处理器的存储器和至少一个程序模块的计算设备,所述至少一个程序模块当被加载到存储器中时,使得至少一个处理器:接收通用源代码;生成全局共享的通用代码;以及生成用于全局共享的通用代码的元数据。另外,一个或多个程序模块接收全局共享的通用代码,其中全局共享的通用代码的特定实例在运行时基于存储在堆栈上的局部数据的大小来计算堆栈的大小。另外,一个或多个程序模块可以在运行时跟踪特定局部数据片存储在堆栈中的何处。此外,当局部数据可以被垃圾收集时,一个或多个程序模块可以告知垃圾收集器。另外,一个或多个程序模块可以告知垃圾收集器堆栈中在哪里可以找到可以被垃圾收集的局部数据。此外,一个或多个程序模块在堆栈上为每个代码段指派它自己的帧。堆栈可以包括GC报告区域。响应于在编译时没有接收到参数,可以生成全局共享的通用代码。合适的计算环境的示例
为了提供本文所公开的主题的各个方面的上下文,图3和以下讨论旨在提供在其中可以实现本文所公开的主题的各种实施例的合适的计算环境510的简要概述。虽然在由一个或多个计算机或其他计算设备执行的计算机可执行指令(诸如程序模块)的通用上下文中描述了本文所公开的主题,但是本领域技术人员将认识到本文所公开的主题的各部分可以也可以与其他程序模块和/或硬件和软件的组合来实现。通常,程序模块包括执行特定任务或实现特定数据类型的例程、程序、对象、物理工件、数据结构等。通常,可以根据需要在各种实施例中组合或分布程序模块的功能性。计算环境510仅是合适的操作环境的一个示例,并且不旨在限制本文所公开的主题的使用范围或功能性。
参照图3,描述了计算机512形式的计算设备。计算机512可以包括至少一个处理单元514、***存储器516和***总线518。至少一个处理单元514可以执行存储在存储器(诸如但不限于***存储器516)中的指令。处理单元514可以是各种可用处理器中的任何一种。例如,处理单元514可以是图形处理单元(GPU)。指令可以是用于实现由上面讨论的一个或多个组件或模块执行的功能性的指令或用于实现上述一个或多个方法的指令。
也可以采用双微处理器和其他多处理器架构作为处理单元514。可以在支持在显示屏上渲染图形的***中使用计算机512。在另一示例中,可以在包括图形处理单元的***中使用计算设备的至少一部分。***存储器516可以包括易失性存储器520和非易失性存储器522。非易失性存储器522可以包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)或闪存。易失性存储器520可以包括随机存取存储器(RAM),其可以用作外部高速缓存存储器。***总线518将包括***存储器516的***物理工件耦合到处理单元514。***总线518可以是若干类型中的任何一种,包括存储器总线、存储器控制器、***总线、外部总线或本地总线,并且可以使用任何各种可用的总线架构。计算机512可以包括可由处理单元514通过***总线518访问的数据存储。数据存储可以包括用于图形渲染的可执行指令、3D模型、材料、纹理等。
计算机512通常包括各种计算机可读介质,诸如易失性和非易失性介质、可移动和不可移动介质。计算机可读介质可以以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据之类的信息的任何方法或技术来实现。计算机可读介质包括计算机可读储存介质(也被称为计算机储存介质)和通信介质。计算机储存介质包括物理(有形)介质,诸如但不限于:RAM、ROM、EEPROM、闪存或其他存储器技术、CDROM、数字万用盘(DVD)或其他光盘储存器、磁带盒、磁带、磁盘储存器或可以存储所期望数据并且可以由计算机512访问的其他磁储存设备。通信介质包括:诸如但不限于通信信号、调制载波或可以被用来传达所期望信息并且可以由计算机512访问的任何其他无形介质的介质。
应当理解,图3描述了可以充当用户和计算机资源之间的中介的软件。该软件可以包括操作***528,其可以被存储在磁盘储存器524上,并且可以分配计算机512的资源。磁盘储存器524可以是通过不可移动存储器接口而被连接到***总线518的硬盘驱动器。***应用530利用操作***528通过程序模块532和存储在***存储器516中或磁盘储存器524上的程序数据534来管理资源。可以理解,可以利用各种操作***或操作***的组合来实现计算机。
用户可以通过(多个)输入设备536将命令或信息输入到计算机512中。输入设备536包括但不限于:诸如鼠标、轨迹球、触控笔、触摸板、键盘、麦克风、语音识别和手势识别***等等之类的指示设备。这些和其他输入设备经由(多个)接口端口538通过***总线518而连接到处理单元514。(多个)接口端口538可以表示串行端口、并行端口、通用串行总线(USB)等。(多个)输出设备540可以使用与输入设备相同类型的端口。提供输出适配器542以图示存在一些输出设备540,例如需要特定适配器的监视器、扬声器和打印机。输出适配器542包括但不限于在输出设备540和***总线518之间提供连接的视频和声卡。诸如(多个)远程计算机544之类的其他设备和/或***或设备可以提供输入和输出能力。
计算机512可以使用到一个或多个远程计算机(诸如远程计算机544)的逻辑连接而在联网环境中运行。远程计算机544可以是个人计算机、服务器、路由器、网络PC、对等设备或其他公共网络节点,并且通常包括上面相对于计算机512描述的许多或所有元件——尽管图3中仅图示出了存储器储存设备546。(一多个)远程计算机544可以经由(多个)通信连接550而逻辑连接。网络接口548包括诸如局域网(LAN)和广域网(WAN)之类的通信网络,但也可以包括其他网络。(多个)通信连接550指的是被采用来将网络接口548连接到总线518的硬件/软件。(多个)通信连接550可以在计算机512的内部或外部,并且包括内部和外部技术,诸如调制解调器(电话、电缆、DSL和无线)和ISDN适配器、以太网卡等。
应当理解,所示出的网络连接仅仅是示例,并且可以使用在计算机之间建立通信链路的其他手段。本领域普通技术人员可以理解,计算机512或其他客户端设备可以被部署为计算机网络的一部分。在这方面,本文所公开的主题可以涉及具有任意数量的存储器或储存单元的任何计算机***,以及在任意数量的储存单元或卷上发生的任何数量的应用和过程。本文所公开的主题的各方面可以应用于具有部署在网络环境中的具有远程或本地储存器的服务器计算机和客户端计算机的环境。本文所公开的主题的各方面还可以应用于具有编程语言功能性、解释和执行能力的独立计算设备。
图4图示出了集成开发环境(IDE)600和公共语言运行时环境602。IDE 600可以允许用户(例如开发人员、程序员、设计者、编码员等)设计、编码、编译、测试、运行、编辑在计算机***中调试或构建程序、程序集、网站、Web应用和Web服务。软件程序可以包括以一种或多种源代码语言(例如Visual Basic、Visual J#、C++、C#、J#、Java Script、APL、COBOL、Pascal、Eiffel、Haskell、ML、Oberon、Perl、Python、Scheme、Smalltalk等)创建的源代码(组件610)。IDE 600可以提供本机代码开发环境,或者可以提供在虚拟机上运行的托管代码开发或者可以提供其组合。IDE 600可以使用.NET框架来提供托管代码开发环境。当执行应用时,可以使用语言特定的源编译器620来从源代码组件610和本机代码组件611创建中间语言组件650,并且使用中间语言编译器660(例如,即时(JIT)编译器)从中间语言组件650创建本机代码组件611(例如,机器可执行指令)。也就是说,当执行IL应用时,它在被执行的同时被编译为针对正在执行它的平台的适当机器语言,从而使代码在若干平台上可以是可移植的。可替代地,在其他实施例中,可以将程序编译为适合于其预期平台的本机代码机器语言(未示出)。
用户可以经由IDE 600中的用户接口640和源代码编辑器651根据已知的软件编程技术以及与特定源语言相关联的特定逻辑和语法规则来创建和/或编辑源代码组件。此后,可以经由源编译器620来编译源代码组件610,由此可以创建程序的中间语言表示,诸如组件630。组件630可以包括中间语言组件650和元数据642。
可以能够在部署之前验证应用设计。
本文所描述的各种技术可以结合硬件或软件来实现,或者在适当的情况下结合两者的组合来实现。因此,本文所描述的方法和装置或其某些方面或部分可以采用体现在有形介质中的程序代码(即指令)的形式,诸如软盘、CD-ROM、硬盘驱动器或任何其他机器可读储存介质,其中,当程序代码被加载到诸如计算机之类的机器中并由其执行时,该机器成为用于实践本文所公开的主题的各方面的装置。如本文所使用的,术语“机器可读介质”应被视为排除提供(即,存储和/或发射)任何形式的传播信号的任何机制。在可编程计算机上执行程序代码的情况下,计算设备通常将包括处理器、处理器可读的储存介质(包括易失性和非易失性存储器和/或储存元件)、至少一个输入设备以及至少一个输出设备。例如通过使用数据处理API等可以利用特定于域的编程模型方面的创建和/或实现的一个或多个程序可以以利用高级过程或面向对象的编程语言来实现,以与计算机***通信。但是,如果需要,(多个)程序可以用汇编语言或机器语言来实现。在任何情况下,该语言可以是编译或解释语言,并与硬件实现相结合。
尽管用结构特征和/或方法动作特定的语言描述了本主题,但应理解,所附权利要求中定义的主题不必限于上述具体特征或动作。而是,公开了上述具体特征和动作作为实现权利要求的示例形式。
Claims (20)
1.一种计算设备,包括:
至少一个处理器:
存储器,所述存储器被连接到所述至少一个处理器;其中所述至少一个处理器被配置为:
通过执行动作来执行适用于对应通用源代码的每个实例化中所有数据类型的变量和/或对象的全局共享的通用代码的单个实例,以:
在堆栈而不是垃圾收集堆上为局部数据分配空间;
将局部数据存储在所述堆栈上,其中所述局部数据的大小可变;
在所述堆栈上存储已存储的所述局部数据的描述;以及
向后续过程提供精确的垃圾收集GC报告信息,其中所述精确的GC报告信息精确地指示所述堆栈中何处的所述局部数据将被回收;
还包括至少一个程序模块:所述至少一个程序模块基于至少一个通用上下文参数来动态地确定要为局部数据分配的堆栈帧的大小,所述至少一个通用上下文参数包括与所述局部数据相关联的类型描述。
2.根据权利要求1所述的计算设备,其中所述至少一个处理器还被配置为:
在运行时接收所述至少一个通用上下文参数。
3.根据权利要求1所述的计算设备,其中所述至少一个处理器还被配置为:
在运行时接收所述至少一个通用上下文参数,要被创建的所述堆栈帧的所述大小根据所述至少一个通用上下文参数被确定。
4.根据权利要求1所述的计算设备,其中所述至少一个处理器还被配置为:
告知后续过程哪里能够找到用于垃圾收集的所述局部数据。
5.根据权利要求1所述的计算设备,其中所述至少一个处理器还被配置为:
在所述堆栈上为与所述全局共享的通用代码的特定执行相关联的局部数据分配空间。
6.根据权利要求1所述的计算设备,其中所分配的堆栈帧的大小根据所述局部数据的大小而变化。
7.一种用于垃圾收集报告的方法,包括:
由计算设备的处理器通过执行动作来执行适用于对应通用源代码的每个实例化中所有数据类型的变量和/或对象的全局共享的通用代码的单个实例,以:
在堆栈而不是垃圾收集堆上为局部数据分配空间,
将局部数据存储在所述堆栈上,其中所述局部数据的大小可变,
在所述堆栈上存储已存储的所述局部数据的描述,以及
向后续过程提供精确的垃圾收集GC报告信息,其中所述精确的GC报告信息精确地指示所述堆栈中何处的所述局部数据将被回收;
由所述计算设备的至少一个程序模块基于至少一个通用上下文参数来动态地确定要为局部数据分配的堆栈帧的大小,所述至少一个通用上下文参数包括与所述局部数据相关联的类型描述。
8.根据权利要求7所述的方法,还包括:
在运行时接收所述至少一个通用上下文参数。
9.根据权利要求7所述的方法,还包括:
在运行时接收所述至少一个通用上下文参数,要被创建的所述堆栈帧的所述大小根据所述至少一个通用上下文参数被确定。
10.根据权利要求7所述的方法,还包括:
告知后续过程哪里能够找到用于垃圾收集的所述局部数据。
11.根据权利要求7所述的方法,还包括:
在所述堆栈上为与所述全局共享的通用代码的特定执行相关联的局部数据分配空间。
12.根据权利要求7所述的方法,其中所分配的堆栈帧的大小根据所述局部数据的大小而变化。
13.一种计算设备,包括:
至少一个处理器:
存储器,所述存储器被连接到所述至少一个处理器;其中所述至少一个处理器被配置为:
接收通用源代码;
根据所述通用源代码生成全局共享的通用代码的单个实例,所述全局共享的通用代码的单个实例适用于所述通用代码的每个实例化中的所有可能的数据类型的变量和/或对象;
在编译时生成用于所述全局共享的通用代码的元数据,所述元数据与所述通用源代码中的通用类型的字段布局和实例大小相关联;以及
在运行时利用所述元数据和通用上下文参数来确定用于堆栈的堆栈帧的大小,以在所述堆栈而不是垃圾收集堆中分配所述全局共享的通用代码的局部数据。
14.根据权利要求13所述的计算设备,其中所述至少一个处理器还被配置为:
向后续过程提供精确的垃圾收集GC报告信息,其中所述精确的GC报告信息精确地指示存储器中何处的所述局部数据将被回收。
15.根据权利要求14所述的计算设备,其中所述至少一个处理器还被配置为:
在运行时跟踪特定片的局部数据被存储在所述堆栈上的何处。
16.根据权利要求15所述的计算设备,其中所述至少一个处理器还被配置为:
告知垃圾回收器所述局部数据何时能够被垃圾回收。
17.根据权利要求16所述的计算设备,其中所述至少一个处理器还被配置为:
告知所述垃圾回收器能够被回收的所述局部数据在所述堆栈上的何处被找到。
18.根据权利要求14所述的计算设备,其中所述通用源代码的每个代码段在所述堆栈上被指派帧。
19.根据权利要求14所述的计算设备,其中所述堆栈包括报告区域。
20.根据权利要求13所述的计算设备,其中所述全局共享的通用代码响应于在编译时未接收到参数而被生成。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US15/153,755 | 2016-05-13 | ||
US15/153,755 US10127151B2 (en) | 2016-05-13 | 2016-05-13 | Dynamically sized locals with precise garbage collection reporting |
PCT/US2017/031629 WO2017196760A1 (en) | 2016-05-13 | 2017-05-09 | Dynamically sized locals with precise garbage collection reporting |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109154908A CN109154908A (zh) | 2019-01-04 |
CN109154908B true CN109154908B (zh) | 2023-08-29 |
Family
ID=58710147
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201780029685.4A Active CN109154908B (zh) | 2016-05-13 | 2017-05-09 | 具有精确垃圾收集报告的动态大小的局部 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10127151B2 (zh) |
EP (1) | EP3455736B1 (zh) |
CN (1) | CN109154908B (zh) |
WO (1) | WO2017196760A1 (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019084781A1 (en) * | 2017-10-31 | 2019-05-09 | EMC IP Holding Company LLC | Management of data using templates |
CN110020314B (zh) * | 2017-12-21 | 2023-09-29 | 阿里巴巴(中国)有限公司 | Web页面数据处理方法、装置、计算设备和存储介质 |
US11086901B2 (en) | 2018-01-31 | 2021-08-10 | EMC IP Holding Company LLC | Method and system for efficient data replication in big data environment |
CN110569201B (zh) * | 2019-08-23 | 2021-09-10 | 苏州浪潮智能科技有限公司 | 一种固态硬盘GC下降低写latency的方法及装置 |
US20220212100A1 (en) * | 2021-01-04 | 2022-07-07 | Microsoft Technology Licensing, Llc | Systems and methods for streaming interactive applications |
CN113805971B (zh) * | 2021-09-23 | 2023-10-13 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
US11954023B2 (en) | 2022-07-20 | 2024-04-09 | Microsoft Technology Licensing, Llc | Garbage collection prefetching state machine |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6598141B1 (en) * | 2001-03-08 | 2003-07-22 | Microsoft Corporation | Manipulating interior pointers on a stack during garbage collection |
CN102222013A (zh) * | 2010-04-17 | 2011-10-19 | 微软公司 | 用于改变回复力的中间语言支持 |
CN103823714A (zh) * | 2014-01-15 | 2014-05-28 | 浙江大学 | 一种基于虚拟化下NUMA节点内存QoS的调节方法及装置 |
CN105556466A (zh) * | 2013-10-30 | 2016-05-04 | 国际商业机器公司 | 代码堆栈管理 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5903899A (en) * | 1997-04-23 | 1999-05-11 | Sun Microsystems, Inc. | System and method for assisting exact Garbage collection by segregating the contents of a stack into sub stacks |
US5909579A (en) * | 1997-04-23 | 1999-06-01 | Sun Microsystems, Inc. | Method and apparatus for encoding and decoding delta encoded information to locate live pointers in program data stacks |
US6101580A (en) * | 1997-04-23 | 2000-08-08 | Sun Microsystems, Inc. | Apparatus and method for assisting exact garbage collection by using a stack cache of tag bits |
US6381738B1 (en) * | 1999-07-16 | 2002-04-30 | International Business Machines Corporation | Method for optimizing creation and destruction of objects in computer programs |
US20030126590A1 (en) * | 2001-12-28 | 2003-07-03 | Michael Burrows | System and method for dynamic data-type checking |
US7035884B2 (en) | 2002-11-05 | 2006-04-25 | Sun Microsystems, Inc. | Placement of allocation trains in the train algorithm |
US7149870B2 (en) | 2004-06-04 | 2006-12-12 | International Business Machines Corporation | Assigning sections within a memory heap for efficient garbage collection of large objects |
US7596667B1 (en) | 2005-09-01 | 2009-09-29 | Sun Microsystems, Inc. | Method and apparatus for byte allocation accounting in a system having a multi-threaded application and a generational garbage collector that dynamically pre-tenures objects |
US8479178B2 (en) * | 2008-06-27 | 2013-07-02 | Microsoft Corporation | Compiler in a managed application context |
US8776032B2 (en) | 2009-01-29 | 2014-07-08 | Microsoft Corporation | Automatic region-based verification of garbage collectors |
US8375373B2 (en) | 2010-04-19 | 2013-02-12 | Microsoft Corporation | Intermediate language support for change resilience |
US10261764B2 (en) * | 2014-05-13 | 2019-04-16 | Oracle International Corporation | Handling value types |
-
2016
- 2016-05-13 US US15/153,755 patent/US10127151B2/en active Active
-
2017
- 2017-05-09 WO PCT/US2017/031629 patent/WO2017196760A1/en unknown
- 2017-05-09 EP EP17724242.7A patent/EP3455736B1/en active Active
- 2017-05-09 CN CN201780029685.4A patent/CN109154908B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6598141B1 (en) * | 2001-03-08 | 2003-07-22 | Microsoft Corporation | Manipulating interior pointers on a stack during garbage collection |
CN102222013A (zh) * | 2010-04-17 | 2011-10-19 | 微软公司 | 用于改变回复力的中间语言支持 |
CN105556466A (zh) * | 2013-10-30 | 2016-05-04 | 国际商业机器公司 | 代码堆栈管理 |
CN103823714A (zh) * | 2014-01-15 | 2014-05-28 | 浙江大学 | 一种基于虚拟化下NUMA节点内存QoS的调节方法及装置 |
Non-Patent Citations (1)
Title |
---|
一种基于栈式分配的JVM垃圾收集算法;陈贤闯等;《计算机***应用》;20100715(第07期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
EP3455736B1 (en) | 2023-06-14 |
CN109154908A (zh) | 2019-01-04 |
US20170329704A1 (en) | 2017-11-16 |
EP3455736A1 (en) | 2019-03-20 |
WO2017196760A1 (en) | 2017-11-16 |
US10127151B2 (en) | 2018-11-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109154908B (zh) | 具有精确垃圾收集报告的动态大小的局部 | |
EP2340481B1 (en) | Caching runtime generated code | |
US10402208B2 (en) | Adaptive portable libraries | |
US11354159B2 (en) | Method, a device, and a computer program product for determining a resource required for executing a code segment | |
US9928156B2 (en) | Missing include suggestions for external files | |
US8239823B2 (en) | Generating libraries for reflection without project compilation | |
CN109196476B (zh) | 共享垃圾收集器的不同类型图之间的无缝高性能互操作性 | |
US9348567B2 (en) | Profile guided optimization in the presence of stale profile data | |
EP3084598B1 (en) | Execution guards in dynamic programming | |
US11579855B2 (en) | Reduced memory consumption of compiler-transformed asynchronous methods | |
JP2011221609A (ja) | 動的コンパイラプログラム、動的コンパイル方法及び動的コンパイル装置 | |
WO2016094258A1 (en) | Inter-procedural type propagation for devirtualization | |
US10572275B2 (en) | Compatible dictionary layout | |
US11474832B2 (en) | Intelligently determining a virtual machine configuration during runtime based on garbage collection characteristics | |
US20180260304A1 (en) | Mapping dynamic analysis data to source code | |
US20170083298A1 (en) | Resilient format for distribution of ahead-of-time compiled code components | |
US10733095B2 (en) | Performing garbage collection on an object array using array chunk references | |
US9612808B1 (en) | Memory use for string object creation | |
US8949802B1 (en) | Sharding program compilation for large-scale static analysis |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |