CN110187967B - 一种适用于依赖分析工具的内存预测方法及装置 - Google Patents
一种适用于依赖分析工具的内存预测方法及装置 Download PDFInfo
- Publication number
- CN110187967B CN110187967B CN201910400746.4A CN201910400746A CN110187967B CN 110187967 B CN110187967 B CN 110187967B CN 201910400746 A CN201910400746 A CN 201910400746A CN 110187967 B CN110187967 B CN 110187967B
- Authority
- CN
- China
- Prior art keywords
- memory
- occupied
- type
- class
- instance
- 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
- 230000015654 memory Effects 0.000 title claims abstract description 185
- 238000004458 analytical method Methods 0.000 title claims abstract description 39
- 238000000034 method Methods 0.000 title claims abstract description 34
- 238000004364 calculation method Methods 0.000 claims description 21
- 238000000605 extraction Methods 0.000 claims description 6
- 230000001419 dependent effect Effects 0.000 abstract description 13
- 238000001514 detection method Methods 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 10
- 238000004590 computer program Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 244000234281 Tamarix gallica Species 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000035800 maturation Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 241000894007 species Species 0.000 description 1
Images
Classifications
-
- 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
Abstract
本发明公开了一种适用于依赖分析工具的内存预测方法及装置,该方法具体为,从Java程序包文件中提取源代码文件;对所提取的源代码文件进行分析,生成抽象语法树,并获取每个源代码文件生成的抽象语法树中每个种类的节点类的实例对象数量;计算每个种类的节点类实例对象占用内存大小;计算每个源代码文件生成的抽象语法树占用内存大小;计算整个Java程序包所需内存大小。本发明通过对依赖分析工具运行时内存的预测,使得每次依赖分析工具容器能够通过预测得到的内存,分配至内存资源足够的容器运行节点,保证了依赖分析工具运行的稳定性,以及分布式代码检测系统运行稳定性。
Description
技术领域
本发明涉及一种适用于依赖分析工具的内存预测方法及装置,属于计算机内存管理技术领域。
背景技术
随着容器技术的成熟和容器编排工具的不断完善,在云中部署和开发系统已经是越来越多企业的选择。容器云中主要通过容器编排工具,为用户提供了容器自动部署到节点的自动化部署方式,但是若用户不为容器指定所需的CPU以及内存资源,容器所能得到的最多为该容器所在节点上剩余内存以及CPU资源。
现阶段,课题有源文件依赖性分析工具需要在容器云环境中部署运行。该依赖性分析工具主要通过生成的程序文件的语法树的方式对程序文件间的依赖性分析。在分析过程中,这些语法树结构都是存储在内存中,如果不给依赖性分析工具容器设定足够内存资源,可能会存在依赖性分析工具在分析过程中所需内存资源不足的情况,这将会导致工具性能急剧下降甚至导致分析失败。为了保证依赖性分析工具容器在云环境中得到足够的内存资源,就需要在依赖性分析工具容器运行之前,对容器所需的最小内存进行设定。这就意味着需要根据待分析的Java源代码程序包大小,对依赖分析工具需要的内存资源进行预测。
发明内容
本发明的目的在于提供一种适用于依赖分析工具的内存预测方法及装置,使得每次依赖分析工具容器能够通过预测得到的内存,分配至内存资源足够的容器运行节点,保证了依赖分析工具运行的稳定性。
为达到上述目的,本发明采用的技术方案如下:
一种适用于依赖分析工具的内存预测方法,包括以下步骤:
从Java程序包文件中提取源代码文件;
对所述源代码文件进行分析,为每个源代码文件生成抽象语法树;
统计每个抽象语法树中每个种类的节点类的实例对象数量;
计算抽象语法树中每个种类的节点类实例对象占用内存大小;
根据抽象语法树中每个种类的节点类实例对象占用内存大小计算每个源代码文件生成的抽象语法树占用内存大小;
根据每个源代码文件生成的抽象语法树占用内存大小计算整个Java程序包所需内存大小。
前述的为每个源代码文件生成抽象语法树的过程为:
JavaParser工具使用字符流形式读取源代码文件的字符信息,读入的字符流通过词法分析器、语法分析器以及语义分析器进行分析判断,不断生成抽象语法树的节点类的实例对象,直到整个源代码文件被读取完毕。
前述的抽象语法树的节点类的种类包括以下一种或多种:
Body种类;Expr种类;Comments种类;Stmt种类;Tpye种类;由Range类、Position类、TokenRange类和JavaToken类组成的基础种类。
前述的每个种类下的节点类实例对象所占内存相同。
前述的节点类实例对象占用内存分为对象头占用内存、实例数据占用内存和对齐填充占用内存;
所述对象头占用内存为12bytes;
所述实例数据包括原生类型和reference类型;
所述原生类型实例数据占用内存分别为:
boolean:1bytes;
byte:1bytes;
short:2bytes;
char:2bytes;
int:4bytes;
float:4bytes;
long:8bytes;
double:8bytes;
所述reference类型实例数据占用内存为4bytes;
所述对齐填充占用内存是指,在对象头和实例数据占用内存不为8bytes倍数的情况下补齐所占用的内存。
前述的节点类实例对象占用内存计算如下:
RAMk=12bytes+tk实例bytes+tk填充bytes
其中,RAMk表示节点类k的实例对象所占内存,k为Body种类、Expr种类、Comments种类、Stmt种类、Tpye种类以及TokenRange类、Range类、Position类,tk实例表示节点类k的实例对象的实例数据所占内存,tk填充表示节点类k的实例对象的对齐填充所占内存;
如果实例数据为原生类型,则tk实例为所有原生类型的实例数据所占内存之和,如果实例数据为reference类型,则tk实例=4tytes×wk,wk为reference类型的实例数据个数;
其中,RAMJavaToken为JavaToken类实例对象所占内存,NumChar表示在JavaToken类中存储抽象语法树具体信息的String对象中字符串的字符数量,C2表示String对象的对齐填充字符数。
前述的Body种类下的实例对象有11个reference类型的实例数据;所述Expr种类下的实例对象有11个reference类型的实例数据;所述Comments种类下的实例对象有2个reference类型的实例数据;所述Stmt种类下的实例对象有9个reference类型的实例数据;所述Tpye种类下的实例对象有12个reference类型的实例数据;所述TokenRange类的实例对象有2个reference类型的实例数据;所述Range类的实例对象有2个reference类型的实例数据;所述Position类的实例对象有两个int类型的实例数据。
前述的抽象语法树占用内存计算如下:
其中,RAMCU表示单个抽象语法树所占内存,BC表示Body种类下节点类实例对象数量,RAMBody为Body种类下的节点类实例对象所占内存,EC表示Expr种类下节点类实例对象数量,RAMExpr为Expr种类下节点类实例对象所占内存,CC表示Comments种类下节点类实例对象数量,RAMComments为Comments种类下节点类实例对象所占内存,SC表示Stmt种类下节点类实例对象数量,RAMStmt为Stmt种类下节点类实例对象所占内存,TC表示Type种类下节点类实例对象数量,RAMType为Type种类下节点类实例对象所占内存,RAMTokenRang为TokenRange类对象所占内存,RAMRange为Range类对象所占内存,RAMPosition为Position类对象所占内存,(RAMJavaToken)i为第i个JavaToken类对象所占内存,n表示JavaToken类对象的最终数量。
前述的整个Java程序包所需内存计算如下:
其中,TotalRAMPackage表示整个Java程序包占用内存大小,(RAMCU)i表示Java程序包中第i个源代码文件生成的抽象语法树占用内存大小,k为整个Java程序包中源代码文件个数。
一种适用于依赖分析工具的内存预测装置,包括提取模块,抽象语法树生成模块,实例对象统计模块,实例对象内存计算模块,抽象语法树内存计算模块和Java程序包内存计算模块,
所述提取模块用于从Java程序包文件中提取源代码文件;
所述抽象语法树生成模块用于对所述源代码文件进行分析,为每个源代码文件生成抽象语法树;
所述实例对象统计模块用于统计每个抽象语法树中每个种类的节点类的实例对象数量;
所述实例对象内存计算模块用于计算抽象语法树中每个种类的节点类实例对象占用内存大小;
所述抽象语法树内存计算模块用于根据抽象语法树中每个种类的节点类实例对象占用内存大小计算每个源代码文件生成的抽象语法树占用内存大小;
所述Java程序包内存计算模块用于根据每个源代码文件生成的抽象语法树占用内存大小计算整个Java程序包所需内存大小。
本发明的有益效果为:
本发明通过对依赖分析工具运行时内存的预测,使得每次依赖分析工具容器能够通过预测得到的内存,分配至内存资源足够的容器运行节点,保证了依赖分析工具运行的稳定性,使得分布式代码检测系统在对每个检测任务进行分布式检测时,依赖分析能够正常而且稳定运行,保证了分布式代码检测系统运行稳定性。
附图说明
图1为抽象语法树对象生成过程;
图2为Expression类的简要UML类图。
具体实施方式
下面对本发明作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
Java虚拟机运行时数据区主要分为:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区,其中,Java堆中存放的就是对象实例。一个Java程序所占内存可以由下式表示:
TotalRAM=HeapRAM+OtherRAM (1)
式中,TotalRAM为Java程序所占用内存,HeapRAM为Java堆所占用内存,OtherRAM为其他区域所占内存。
由Java程序运行时内存的特性可知,其他区域所占内存OtherRAM在程序没有改变的情况下可以视为不变,即为常量。而Java堆所占用内存HeapRAM可以通过对每个对象实例大小进行求和得到,所以式(1)可以变形为:
式中,i表示第i个对象实例,n为Java程序生成对象实例总数,ObjectRAMi表示第i个对象实例占用内存大小。
依赖分析工具主要是通过JavaParser工具生成的抽象语法树,而每个源代码文件对应一个JavaParser生成的抽象语法树对象。分析工具文件程序包需要Java堆内存的大小,可以视为分析工具生成的所有抽象语法树对象占用内存的大小。同时,每个抽象语法树对象的大小,可以通过分析抽象语法树对象的每个叶子节点类实例对象大小再求和的方式得到。最后,通过式(2)求取依赖分析工具运行所需的内存。
基于上述原理,本发明提出一种适用于依赖分析工具运行所需内存的预测方法,包括以下具体步骤:
(1)对Java程序包文件进行信息处理。
(2)使用抽象语法树生成分析工具的语法分析器,对每个源代码文件进行分析,生成抽象语法树,获取每个源代码文件抽象语法树的节点类的实例对象数量。
(3)计算每个类别的节点类实例对象占用内存大小。
(4)计算每个源代码文件生成的抽象语法树占用内存大小。
(5)计算整个Java程序包所需内存大小。
步骤(1)中,Java程序包包括程序配置文件、程序依赖Jar包以及程序源代码文件,该步骤仅针对程序包中.java源代码文件进行处理,将每个java源代码文件视为一个待分析对象。
步骤(2)中,使用语法分析器对源代码文件进行分析,具体实现过程如下:
图1是JavaParser工具生成抽象语法树的过程,JavaParser工具使用字符流形式读取源代码文件的字符信息,读入的字符流通过词法分析器、语法分析器以及语义分析器进行分析判断,不断生成抽象语法树的节点类的实例对象,直到整个源代码文件被读取完毕。
抽象语法树的节点类实例对象都是存储Java语句信息,这意味着不同形式的Java语句所对应的实例化对象是不同的。由JavaParser工具源码分析可得,构成抽象语法树节点类的种类可以分为以下几种,具体见表1。
表1抽象语法树节点类的种类
由表1可知,构成抽象语法树节点的类大约可分为6种:Body种类、Expr种类、Comments种类、Stmt种类、Tpye种类以及由4个节点信息类组成的基础种类。对于非基础种类而言,虽然每个种类下对应的类数量各有不同,但是同一种类下的类都是同一父类的子类,而且由于同一种类下不同子类的对象成员偏差不大,在对类的实例对象进行数量统计时,可以按照表1的分类,把有同一父类的子类实例对象归为同一种类对象进行统计。所以,一个抽象语法树对象的节点类实例对象数量可以分为除了基础种类的其他五种类型实例对象进行统计。与节点实例对象不同,节点中的实际信息是由Range类、Position类、TokenRange类以及JavaToken类的对象构成,这4个基础类包含源文件中具体的文本信息、位置信息等,其类成员中包含Java的基本数据类型,每个对象的大小与源代码程序文本紧密相关,需要独立进行计算。
步骤(3)中,计算每个类别的节点类实例对象占用内存大小,具体实现过程如下:
在知道生成抽象语法树时每个种类的节点类实例对象数量后,还需要知道每个种类节点类实例对象的具体占用内存大小,才能得到该种类所有节点类实例对象占用的内存大小。所以必须研究每个种类下节点类的具体结构,以及这些结构在Java虚拟机内存中具体占用的空间。
在HotSpot虚拟机中,节点类实例对象在内存中存储布局分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头(Header)包括两部分(非数组对象)信息,第一部分用于存储节点类实例对象自身的运行时数据,二部分是类型指针,即节点类实例对象指向它的类元数据的指针,虚拟机通过这个类型指针来确定这个节点类实例对象是哪个类的实例。实例数据部分(Instance Data)是节点类实例对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。
在64位HotSpot虚拟机且默认开启指针压缩的情况下,节点类实例对象的对象头占用内存12bytes;实例数据包括原生类型(primitive type)和reference类型,原生类型占用空间见表2,reference类型统一占4bytes;对齐填充是在前两块区域占用内存不为8bytes倍数的情况下进行补齐使用的。
表2原生类型(primitive type)的内存占用
所以,节点类实例对象占用内存表示如下:
RAMk=12bytes+tk实例bytes+tk填充bytes
其中,RAMk表示节点类k的实例对象所占内存,k为Body、Expr、Comments、Stmt、Tpye以及基础种类JavaToken、TokenRange、Range、Position,tk实例表示节点类k的实例对象的实例数据所占内存,tk填充表示节点类k的实例对象的对齐填充内存所占数量。
在实例数据为原生类型时,tk实例即为参照表2,求取所有原生类型的实例所占内存之和;如果实例数据为reference类型,则tk实例=4tytes×wk,wk为reference类型的实例数据个数。
以Expr种类下的节点类实例对象为例进行分析,如图2所示,该图为Expr种类所有子类的父类Expression的简要UML类图。可以看出Expression对象有9个reference类型的成员变量,所以可以计算每个Expresion对象占用内存为:
与Expr种类类似,其他四个种类对象的reference类型的成员变量数量如下:Body种类有11个reference类型成员变量、Comments种类有2个reference类型成员变量、Stmt种类有9个reference类型成员变量、Type种类有12个reference类型成员变量,所以有计算公式:
RAMBody=12bytes+4bytes×11+0bytes=56bytes (4)
RAMComments=12bytes+4bytes×2+4bytes=24bytes (5)
RAMStmt=12bytes+4bytes×9+0bytes=48bytes (6)
RAMType=12bytes+4bytes×12+4bytes=64bytes (7)
在图2中4个基本类的具体类成员变量也能被看出,Position类有两个int类型的成员变量,而TokenRange和Range类主要有两个reference类型,而JavaToken对象较为特殊,该对象主要用来表示源代码文件中的标识符,而每个标识符长度都不相同,所以不能通过统计数量的形式进行内存预测,需要预测每个JavaToken对象可能占用的内存。所以,对于4个基本类,每个类实例化后的对象占用内存大小的计算公式如下:
RAMPosition=12bytes+4bytes×2+4bytes=24bytes (8)
RAMRange=12bytes+4bytes×2+4bytes=24bytes (9)
RAMTokenRange=12bytes+4bytes×2+4bytes=24bytes (10)
式(11)中,NumChar表示在JavaToken中存储抽象语法树具体信息的String对象中字符串的字符数量,C2表示String对象的对齐填充字符数。
与Expr种类相同,其他4个种类节点与基本类的关系在图2中可以看出。TokenRange类的实例都是与节点实例对象同时创建的,所以所有TokenRange对象数量可以通过节点实例对象的数量来进行预测;而JavaToken只与TokenRange存在关系,所以JavaToken对象数量可以通过TokenRange对象数量进行预测;同时,Range对象仅与节点实例对象和JavaToken对象存在关系,所以Range对象数量可以通过TokenRange和JavaToken对象数量进行统计;最后,Position对象仅与Range对象存在关系,所以Position对象数量可以通过Range对象数量进行统计。
步骤(4)中,计算整个抽象语法树占用内存大小,具体实现过程如下:
本发明只预测大致内存,所以每个种类下的实例对象因为差距不大可以认为其所占内存是相同的,只有具体存储实际信息的JavaToken类会不同。
由前两步分析可知,整个抽象语法树占用内存大小计算公式如下:
式中,BC表示Body种类下节点类实例对象数量,RAMBody为Body种类下的节点类实例对象所占内存,EC表示Expr种类下节点类实例对象数量,RAMExpr为Expr种类下节点类实例对象所占内存,CC表示Comments种类下节点类实例对象数量,RAMComments为Comments种类下节点类实例对象所占内存,SC表示Stmt种类下节点类实例对象数量,RAMStmt为Stmt种类下节点类实例对象所占内存,TC表示Type种类下节点类实例对象数量,RAMType为Type种类下节点类实例对象所占内存,RAMTokenRang为TokenRange类对象所占内存,RAMRange为Range类对象所占内存,RAMPosition为Position类对象所占内存,n表示JavaToken类对象的最终数量。
步骤(5)中,计算整个Java源代码程序包所需内存大小,具体实现过程如下:
该步骤主要是统计Java程序包中所有源代码文件生成的抽象语法树所需内存大小,具体计算公式如下:
式中,TotalRAMPackage表示整个Java程序包占用内存大小;(RAMCU)i表示Java程序包中第i个源代码文件生成的抽象语法树占用内存大小,k为整个程序包中源代码文件个数。
本发明所述方法的其他具体技术详细描述需参阅本发明上述说明中相应部分的描述,不再累述。
本发明还提供了一种适用于依赖分析工具的内存预测装置,包括提取模块,抽象语法树生成模块,实例对象统计模块,实例对象内存计算模块,抽象语法树内存计算模块和Java程序包内存计算模块,
所述提取模块用于从Java程序包文件中提取源代码文件;
所述抽象语法树生成模块用于对所述源代码文件进行分析,为每个源代码文件生成抽象语法树;
所述实例对象统计模块用于统计每个抽象语法树中每个种类的节点类的实例对象数量;
所述实例对象内存计算模块用于计算抽象语法树中每个种类的节点类实例对象占用内存大小;
所述抽象语法树内存计算模块用于根据抽象语法树中每个种类的节点类实例对象占用内存大小计算每个源代码文件生成的抽象语法树占用内存大小;
所述Java程序包内存计算模块用于根据每个源代码文件生成的抽象语法树占用内存大小计算整个Java程序包所需内存大小。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
Claims (10)
1.一种适用于依赖分析工具的内存预测方法,其特征在于,包括以下步骤:
从Java程序包文件中提取源代码文件;
对所述源代码文件进行分析,为每个源代码文件生成抽象语法树;
统计每个抽象语法树中每个种类的节点类的实例对象数量;
计算抽象语法树中每个种类的节点类实例对象占用内存大小;
根据抽象语法树中每个种类的节点类实例对象占用内存大小计算每个源代码文件生成的抽象语法树占用内存大小;
根据每个源代码文件生成的抽象语法树占用内存大小计算整个Java程序包所需内存大小。
2.根据权利要求1所述的一种适用于依赖分析工具的内存预测方法,其特征在于,所述为每个源代码文件生成抽象语法树的过程为:
JavaParser工具使用字符流形式读取源代码文件的字符信息,读入的字符流通过词法分析器、语法分析器以及语义分析器进行分析判断,不断生成抽象语法树的节点类的实例对象,直到整个源代码文件被读取完毕。
3.根据权利要求1所述的一种适用于依赖分析工具的内存预测方法,其特征在于,所述抽象语法树的节点类的种类包括以下一种或多种:
Body种类;Expr种类;Comments种类;Stmt种类;Tpye种类;由Range类、Position类、TokenRange类和JavaToken类组成的基础种类。
4.根据权利要求1所述的一种适用于依赖分析工具的内存预测方法,其特征在于,每个种类下的节点类实例对象所占内存相同。
5.根据权利要求1所述的一种适用于依赖分析工具的内存预测方法,其特征在于,节点类实例对象占用内存分为对象头占用内存、实例数据占用内存和对齐填充占用内存;
所述对象头占用内存为12bytes;
所述实例数据包括原生类型和reference类型;
所述原生类型实例数据占用内存分别为:
boolean:1bytes;
byte:1bytes;
short:2bytes;
char:2bytes;
int:4bytes;
float:4bytes;
long:8bytes;
double:8bytes;
所述reference类型实例数据占用内存为4bytes;
所述对齐填充占用内存是指,在对象头和实例数据占用内存不为8bytes倍数的情况下补齐所占用的内存。
6.根据权利要求5所述的一种适用于依赖分析工具的内存预测方法,其特征在于,所述节点类实例对象占用内存计算如下:
RAMk=12bytes+tk实例bytes+tk填充bytes
其中,RAMk表示节点类k的实例对象所占内存,k为Body种类、Expr种类、Comments种类、Stmt种类、Tpye种类以及TokenRange类、Range类、Position类,tk实例表示节点类k的实例对象的实例数据所占内存,tk填充表示节点类k的实例对象的对齐填充所占内存;
如果实例数据为原生类型,则tk实例为所有原生类型的实例数据所占内存之和,如果实例数据为reference类型,则tk实例=4tytes×wk,wk为reference类型的实例数据个数;
其中,RAMJavaToken为JavaToken类实例对象所占内存,NumChar表示在JavaToken类中存储抽象语法树具体信息的String对象中字符串的字符数量,C2表示String对象的对齐填充字符数。
7.根据权利要求6所述的一种适用于依赖分析工具的内存预测方法,其特征在于,所述Body种类下的实例对象有11个reference类型的实例数据;所述Expr种类下的实例对象有11个reference类型的实例数据;所述Comments种类下的实例对象有2个reference类型的实例数据;所述Stmt种类下的实例对象有9个reference类型的实例数据;所述Tpye种类下的实例对象有12个reference类型的实例数据;所述TokenRange类的实例对象有2个reference类型的实例数据;所述Range类的实例对象有2个reference类型的实例数据;所述Position类的实例对象有两个int类型的实例数据。
8.根据权利要求6所述的一种适用于依赖分析工具的内存预测方法,其特征在于,抽象语法树占用内存计算如下:
其中,RAMCU表示单个抽象语法树所占内存,BC表示Body种类下节点类实例对象数量,RAMBody为Body种类下的节点类实例对象所占内存,EC表示Expr种类下节点类实例对象数量,RAMExpr为Expr种类下节点类实例对象所占内存,CC表示Comments种类下节点类实例对象数量,RAMComments为Comments种类下节点类实例对象所占内存,SC表示Stmt种类下节点类实例对象数量,RAMStmt为Stmt种类下节点类实例对象所占内存,TC表示Type种类下节点类实例对象数量,RAMType为Type种类下节点类实例对象所占内存,RAMTokenRang为TokenRange类对象所占内存,RAMRange为Range类对象所占内存,RAMPosition为Position类对象所占内存,(RAMJavaToken)i为第i个JavaToken类对象所占内存,n表示JavaToken类对象的最终数量。
10.一种适用于依赖分析工具的内存预测装置,其特征在于,包括提取模块,抽象语法树生成模块,实例对象统计模块,实例对象内存计算模块,抽象语法树内存计算模块和Java程序包内存计算模块,
所述提取模块用于从Java程序包文件中提取源代码文件;
所述抽象语法树生成模块用于对所述源代码文件进行分析,为每个源代码文件生成抽象语法树;
所述实例对象统计模块用于统计每个抽象语法树中每个种类的节点类的实例对象数量;
所述实例对象内存计算模块用于计算抽象语法树中每个种类的节点类实例对象占用内存大小;
所述抽象语法树内存计算模块用于根据抽象语法树中每个种类的节点类实例对象占用内存大小计算每个源代码文件生成的抽象语法树占用内存大小;
所述Java程序包内存计算模块用于根据每个源代码文件生成的抽象语法树占用内存大小计算整个Java程序包所需内存大小。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910400746.4A CN110187967B (zh) | 2019-05-15 | 2019-05-15 | 一种适用于依赖分析工具的内存预测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910400746.4A CN110187967B (zh) | 2019-05-15 | 2019-05-15 | 一种适用于依赖分析工具的内存预测方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110187967A CN110187967A (zh) | 2019-08-30 |
CN110187967B true CN110187967B (zh) | 2022-08-05 |
Family
ID=67716289
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910400746.4A Active CN110187967B (zh) | 2019-05-15 | 2019-05-15 | 一种适用于依赖分析工具的内存预测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110187967B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111858258A (zh) * | 2020-07-29 | 2020-10-30 | 浪潮电子信息产业股份有限公司 | 一种内存监控方法、装置及电子设备和存储介质 |
CN113268243B (zh) * | 2021-05-11 | 2024-02-23 | 网易(杭州)网络有限公司 | 内存预测方法及装置、存储介质、电子设备 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106294156B (zh) * | 2016-08-11 | 2018-12-07 | 北京邮电大学 | 一种静态代码缺陷检测分析方法及装置 |
CN109033843B (zh) * | 2018-08-02 | 2022-06-10 | 南瑞集团有限公司 | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 |
-
2019
- 2019-05-15 CN CN201910400746.4A patent/CN110187967B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN110187967A (zh) | 2019-08-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7543271B2 (en) | Compiling source code using generic classes | |
US7975256B2 (en) | Optimizing application performance through data mining | |
Wang et al. | Precise constraint-based type inference for Java | |
JPH1040114A (ja) | C++プログラムのコンパイル方法及びコンパイラ | |
CN110231994B (zh) | 内存分析方法、装置和计算机可读存储介质 | |
CN109032631B (zh) | 应用程序补丁包获取方法、装置、计算机设备及存储介质 | |
CN110673839B (zh) | 分布式工具配置化构建生成方法及系统 | |
CN103718159B (zh) | 图像处理软件开发方法、图像处理软件开发装置 | |
CN110187967B (zh) | 一种适用于依赖分析工具的内存预测方法及装置 | |
CN108595187A (zh) | 安卓安装包集成软件开发工具包的法、装置及存储介质 | |
CN110007926B (zh) | 语言转换方法及装置 | |
CN112394942A (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
CN112799937B (zh) | 基于GitHub自动化检测Maven项目中依赖冲突问题的方法 | |
JP2005063449A (ja) | オブジェクトからオブジェクトへのJavaネイティブインタフェースマッピングの方法及び装置 | |
Hoover | Alphonse: Incremental computation as a programming abstraction | |
CN111913878A (zh) | 基于程序分析结果的字节码插桩方法、装置及存储介质 | |
US20020062478A1 (en) | Compiler for compiling source programs in an object-oriented programming language | |
CN112445706A (zh) | 程序异常代码获取方法、装置、电子设备以及存储介质 | |
US7647581B2 (en) | Evaluating java objects across different virtual machine vendors | |
Li et al. | A service-oriented componentization framework for java software systems | |
CN111352631A (zh) | 一种接口兼容性检测方法及装置 | |
CN116578282A (zh) | 代码生成方法、装置、电子设备及介质 | |
US9026985B2 (en) | Dynamically configurable model-to-model transformation engine | |
CN110673890A (zh) | 插件调用方法、系统、介质及装置 | |
Rohatgi et al. | Approach for solving the feature location problem by measuring the component modification impact |
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 |