一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

Java虚拟机堆内存集合对象监测方法及内存溢出分析方法与流程

2022-06-01 15:05:59 来源:中国专利 TAG:

java虚拟机堆内存集合对象监测方法及内存溢出分析方法
技术领域
1.本公开涉及计算机领域,尤其涉及一种java虚拟机(java virtual machine,简称为jvm)堆内存集合对象监测方法及内存溢出分析方法。


背景技术:

2.在java应用中经常出现内存溢出。同时应用监测可能影响应用性能。针对内存溢出监测和分析,相关技术尚未提出有效的解决方案。


技术实现要素:

3.根据本公开的一方面,提供了一种java虚拟机堆内存集合对象监测方法,包括:监测向集合对象存储元素对象的方法的调用;在监测到调用的情况下,确定集合对象占用的内存大小;根据集合对象占用的内存大小确定是否获取调用栈;在确定获取调用栈的情况下,获取向集合对象存储元素对象的方法对应的调用栈;将获取的调用栈作为集合对象的监测数据发送至服务端。
4.根据本公开的另一方面,提供了一种内存溢出分析方法,包括:接收内存溢出之前的一个或多个集合对象的监测数据,其中,每个集合对象的所述监测数据包括向该集合对象存储元素对象的方法对应的调用栈;对于该一个或多个集合对象中至少一个集合对象,合并每个集合对象对应的调用栈,以得到每个集合对象对应的调用路径占比。
5.根据本公开的又一方面,提供了一种java虚拟机堆内存集合对象监测装置,包括:监测模块,用于监测向集合对象存储元素对象的方法的调用;第一确定模块,用于在监测到调用的情况下,确定集合对象占用的内存大小;第二确定模块,用于根据集合对象占用的内存大小确定是否获取调用栈;获取模块,用于在确定获取调用栈的情况下,获取向集合对象存储元素对象的方法对应的调用栈;发送模块,用于将获取的调用栈作为集合对象的监测数据发送至服务端。
6.根据本公开的又一方面,提供了一种内存溢出分析装置,包括:接收模块,用于接收内存溢出之前的一个或多个集合对象的监测数据,其中,每个集合对象的所述监测数据包括向该集合对象存储元素对象的方法对应的调用栈;分析模块,用于对于该一个或多个集合对象中至少一个集合对象,合并每个集合对象对应的调用栈,以得到每个集合对象对应的调用路径占比。
7.根据本公开的又一方面,提供了一种电子设备,包括:处理器;以及存储程序的存储器,其中,程序包括指令,指令在由处理器执行时使处理器执行本公开示例性实施例的java虚拟机堆内存集合对象监测方法或内存溢出分析方法。
8.根据本公开的又一方面,提供了存储有计算机指令的非瞬时计算机可读存储介质,计算机指令用于使计算机执行本公开示例性实施例的java虚拟机堆内存集合对象监测方法或内存溢出分析方法。
9.本公开示例性实施例中提供的一个或多个技术方案,可以实现java虚拟机堆内存
的监测。
附图说明
10.在下面结合附图对于示例性实施例的描述中,本公开的更多细节、特征和优点被公开,在附图中:
11.图1示出了根据本公开示例性实施例的可以在其中实施本文描述的各种方法的示例系统的示意图;
12.图2示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测方法的流程图;
13.图3示出了根据本公开示例性实施例的确定集合对象占用的内存大小的方法的流程图;
14.图4示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测方法的另一流程图;
15.图5示出了根据本公开示例性实施例java虚拟机堆内存集合对象监测方法的又一流程图;
16.图6示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测装置的结构框图;
17.图7示出了根据本公开示例性实施例的内存溢出分析方法的流程图;
18.图8示出了根据本公开示例性实施例的内存溢出分析装置的结构框图;
19.图9示出了能够用于实现本公开的实施例的示例性电子设备的结构框图。
具体实施方式
20.下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
21.应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
22.本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
23.需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
24.本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
25.以下参照附图描述本公开的方案。
26.图1示出了根据本公开示例性实施例的可以在其中实施本文描述的各种方法的示例系统的示意图,如图1所示,示例系统100包括:监测装置110和服务端120。监测装置110与服务端120通信连接。监测装置110被配置为监测java应用200,并向服务器120发送监测数据。服务端120被配置为接收并存储监测数据,并可统计和分析监测数据。java应用200可包括服务端的应用程序。作为一种示例,java应用200可为微服务架中的组件或服务。
27.作为一种示例,示例系统100还可包括客户端130,客户端130与服务端120通信连接。客户端130可被配置为显示监测数据、显示检测数据的统计和分析结果等。客户端130可包括个人计算机、智能手机、平板电脑、监控大屏等电子设备,这些电子设备可被配置为通过浏览器、应用程序等图形用户界面显示信息以及响应用户操作。
28.java虚拟机是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。java虚拟机屏蔽了与具体操作系统平台相关的信息,使java应用生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
29.java虚拟机工具接口(jvm tool interface,简称为jvmti)是java虚拟机定义的一个开发和监控java虚拟机使用的程序接口(programing interface),通过该接口可以探查java虚拟机内部的一些运行状态,甚至控制java虚拟机应用程序的执行。
30.java堆(heap)是jvm用来存储对象实例以及数组值的区域,可以认为java中所有通过new创建的对象的内存都在此分配。
31.集合类:在java语言中集合类通常指的是list、map、set、queue,其中的一大作用就是存储元素对象,例如:在程序里获取到一个用户信息列表,那么这个列表存储的方式通常是使用集合对象进行存储,还有一种方式是使用数组进行存储。但集合比数组的优势是集合可以自动扩容,数组是需要程序代码手动的进行扩容,通常是不方便的。
32.java应用存在堆内存溢出的问题。溢出场景的示例包括:从数据库中做了一个没有限制的select查询,导致几十万数据加载到内存中,并且没有及时释放。另一示例为:用全局map做了一个缓存,没有清理机制或者清理不及时,缓存对象一直在往map里存放。也有读取了一个超大的字符串超过了内存限制,或者读取字节内容数组溢出。
33.而当出现内存问题后,分析内存溢出的原因却比较麻烦,通常需要在命令行中增加-xx: heapdumponoutofmemoryerror配置来开启溢出时打内存dump文件(内存dump:通常指的是将进程中的内存数据,存储到文件中),打出的dump文件还需要使用内存分析工具(memory analyzer tool,简称为mat)进行分析,但是分析的问题也只能看出是哪个对象的引用关系。
34.本实施例提供了一种java虚拟机堆内存集合对象监测方法,获取向集合对象存储元素对象的方法对应的调用栈,以至少可用于内存溢出原因分析。
35.图2示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测方法的流程图,如图2所示,该方法包括步骤s201至步骤s205。
36.步骤s201,监测向集合对象存储元素对象的方法的调用。
37.在java语言中,集合对象可包括但不限于列表(list)、映射(map)、集合(set)、队
列(queue)及用户自己实现的集合类。list、map、set、queue这些类都是接口,实现类有arraylist、hashmap、hashset、linkedqueue等。
38.集合对象是可以存储元素对象的容器。向集合对象存储元素对象的方法通常包括add(object obj)、put(object key,object value)、offer(object obj)等,但不限于这些方法。从集合对象移除元素对象的方法通常包括remove、poll等,但不限于这些方法。
39.在步骤s201中,监测向集合对象存储元素对象的方法的调用。作为一种示例,对add(object obj)、put(object key,object value)、offer(object obj)等向集合对象存储元素对象的方法进行嵌码,在这些方法被调用时执行本实施例的监测逻辑。
40.步骤s202,在监测到向集合对象存储元素对象的方法的调用的情况下,确定上述集合对象占用的内存大小。
41.步骤s203,根据上述集合对象占用的内存大小确定是否获取调用栈。
42.获取调用栈会消耗java应用的性能,在本实施例中,根据集合对象占用的内存大小来确定是否获取调用栈,以避免频繁获取调用栈而影响java应用的性能。
43.作为一种实施方式,在集合对象占用的内存大小大于或等于预设大小时,发生内存溢出的风险更大,因此在步骤s203中,判断集合对象占用的内存大小是否大于或等于预设大小。在集合对象占用的内存大小大于或等于预设大小的情况下,确定获取调用栈。在集合对象占用的内存大小小于预设大小的情况下,不获取调用栈。作为一种示例,该预设大小可由客户端接收用户输入来确定,但不限于此。
44.作为一种实施方式,在集合对象占用的内存大小大于或等于预设大小的情况下,进一步判断集合对象占用的内存大小是否呈增长趋势。在集合对象占用的内存大小呈增长趋势的情况下,确定获取调用栈。作为一种示例,在确定集合对象占用的内存大小后,存储确定得到的集合对象占用的内存大小,再次确定该集合对象占用的内存大小后,比较新确定的内存大小与存储的内存大小,在新确定的内存大小大于存储的内存大小时,确定集合对象占用的内存大小呈增长趋势。本实施例并不限于此,其他分析数据变化趋势的方式也是可行的,本实施例对此不作赘述。
45.作为一种示例,上述预设大小可至少包括第一预设大小和第二预设大小,其中,第一预设大小小于第二预设大小。在集合对象占用的内存大小大于或等于第一预设大小的情况下,进一步判断集合对象占用的内存大小是否呈增长趋势,在集合对象占用的内存大小大于或等于第一预设大小且呈增长趋势的情况下,确定获取调用栈。在集合对象占用的内存大小大于或等于第二预设大小的情况下,确定获取调用栈。
46.步骤s204,在确定获取调用栈的情况下,获取向上述集合对象存储元素对象的方法对应的调用栈。
47.在java中,上述步骤s204中,可在向集合对象存储元素对象的方法中使用thread.currentthread().getstacktrace()获取调用栈,由该方法返回当前线程的调用栈,也就是向集合对象存储元素对象的方法对应的调用栈。
48.步骤s205,将获取的调用栈作为集合对象的监测数据发送至服务端。
49.作为一种实施方式,还包括:将集合对象占用的内存大小作为集合对象的监测数据。发送至服务端的监测数据包括获取的调用栈和集合对象占用的内存大小。作为一种示例,服务端可存储监测数据,监测数据可包括集合对象的信息、获取的调用栈和集合对象占
用的内存大小,还可包括获取时间等信息,本实施例对此不作限定。作为一种实施方式,使用每次获取的集合对象占用的内存大小,更新该集合对象的监测数据中该集合对象占用的内存大小。
50.步骤s202中确定集合对象占用的内存大小,图3示出了根据本公开示例性实施例的确定集合对象占用的内存大小的方法的流程图,如图3所示,该方法包括步骤s301至步骤s304。
51.步骤s301,获取集合对象的元素对象数量。
52.集合对象的元素对象数量也称为集合对象的大小(size)或长度,也就是集合对象包括多少个元素对象。通常集合对象具有获取size的方法,例如,通过“stringlists.size()”获取“stringlists”的元素对象数量。但本实施例并不限于此。
53.步骤s302,获取上述调用存储的元素对象占用的内存大小。
54.作为一种实施方式,步骤s302中可遍历上述调用存储的元素对象的所有引用并进行递归遍历计算,得到上述调用存储的元素对象占用的内存大小。作为一种示例,借助jvmti中的堆遍历方法followreferences可以遍历指定对象的所有引用。
55.在步骤s302中,可存储获取的调用存储的元素对象占用的内存大小,作为历史调用存储的元素对象占用的内存大小。
56.步骤s303,根据上述调用存储的元素对象占用的内存大小和至少部分历史调用存储的元素对象占用的内存大小确定元素对象平均大小。
57.在步骤s303中,作为一种示例,元素对象平均大小可为上述调用和至少部分历史调用存储的元素对象占用的内存大小的平均值,但本实施例并不限于此,其他统计方法也是可以被构想的,本实施例对此不作赘述。
58.步骤s304,根据元素对象平均大小和元素对象数量确定集合对象占用的内存大小。
59.在步骤s304中,集合对象占用的内存大小包括所有元素对象占用的内存大小,所有元素对象占用的内存大小可为元素对象平均大小与元素对象数量的乘积。例如,集合对象包括a个元素对象,元素对象平均大小为b,则所有元素对象占用的内存大小为a*b。集合对象占用的内存大小还包括集合对象本身的大小,集合对象占用的内存大小可为集合对象本身的大小与所有元素对象占用的内存大小之和。
60.上述步骤s302中获取调用存储的元素对象占用的内存大小影响java应用的性能,为避免频繁进行该处理,作为一种实施方式,配置对部分调用进行处理的预设策略来确定是否获取调用存储的元素占用的内存大小。在上述步骤s302之前,判断是否符合预设策略。在符合预设策略的情况下,进行步骤s302,获取上述调用存储的元素对象占用的内存大小。在不符合预设策略的情况下,结束对本次调用的监测。
61.作为一种示例,预测策略为频率控制,频率控制可减少计算的频繁度,避免过多的计算影响java应用的性能。频率控制实现的方式可包括时间窗口控制、调用频次控制等。
62.时间窗口控制的方式是在指定时间内只允许计算一次。作为一个例子,时间窗口被配置为5秒,在5秒内执行一次步骤s302。对于每个时间窗口,如果监测到向集合对象存储元素对象的方法的调用,确定集合对象占用的内存大小,并将当前时间窗口标记为已处理,如果在当前时间窗口中再次监测到向集合对象存储元素对象的方法的调用,则由于当前时
间窗口标记为已处理而不确定集合对象占用的内存大小,直到进入下一个时间窗口。
63.调用频次控制的方式是在调用指定次数后允许计算一次。作为一个例子,每次监测到向集合对象存储元素对象的方法的调用,对调用的次数进行累加计数,在累加计数达到预设次数(例如100次)后,确定集合对象占用的内存大小,并将调用的次数清零。
64.作为一种实施方式,在判断是否符合预设策略之前,还可判断集合对象的元素对象数量是否大于或等于预设数量。在集合对象的元素对象数量大于或等于预设数量的情况下,进行是否符合预设策略的判断。在集合对象的元素对象数量小于预设数量的情况下,结束对本次调用的监测。
65.作为一种实施方式,步骤s302中遍历上述调用存储的元素对象的所有引用并进行递归遍历计算,得到上述调用存储的元素对象占用的内存大小。
66.图4示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测方法的另一流程图,如图4所示,该方法包括步骤s401至步骤s410。
67.步骤s401,监测向集合对象存储元素对象的方法的调用。
68.步骤s402,在监测到上述调用的情况下,获取集合对象的元素对象数量。
69.步骤s403,判断集合对象的元素对象数量是否大于或等于预设数量。
70.在本实施例中,可基于java应用的特点等因素配置合适的预设数量。例如,对于元素对象(例如图片)占用的内存较大的集合对象,可设置相对较小的预设数量,对于元素对象(例如简单字符)占用的内存较小的集合对象,可设置相对较大的预设数量。
71.在集合对象的元素对象数量大于或等于预设数量的情况下,进行步骤s404,判断是否符合预设策略,其中,预设策略被配置对部分调用进行处理。由此,通过预设策略来对部分调用进行处理,以避免频繁对调用进行处理而影响java应用的性能。作为一种示例,在集合对象的元素对象数量小于上述预设数量的情况下,结束对本次调用的监测。
72.在符合上述预设策略的情况下,进行步骤s405,获取上述调用存储的元素对象占用的内存大小。作为一种示例,在不符合上述预设策略的情况下,结束对本次调用的监测。
73.作为一种示例,在步骤s405遍历上述调用存储的元素对象的所有引用并进行递归遍历计算,得到该调用存储的元素对象占用的内存大小。
74.步骤s406,根据上述调用存储的元素对象占用的内存大小和至少部分历史调用存储的元素对象占用的内存大小确定元素对象平均大小。
75.基于步骤s403和步骤s404的判断,在多次调用中,对部分调用进行处理,而对另一部分调用不进行处理,因而可获取部分调用存储的元素对象占用的内存大小。考虑到集合对象中元素对象一般具有相似性,在步骤s406中,通过获取的部分调用存储的元素对象占用的内存大小估计元素对象平均大小。
76.步骤s407,根据元素对象平均大小和元素对象数量确定集合对象占用的内存大小。
77.作为一种示例,集合对象占用的内存大小为集合对象本身占用的内存大小与集合对象的所有元素对象占用的内存大小之和。
78.java对象保存在内存中时,包括以下三部分:对象头(hearder)、实例数据和对齐填充字节。对象头主要包括两部分数据:标记字(mark word)、类(class)对象指针。在64位的hotspot虚拟机下,mark word占8个字节,其记录了hash code、gc信息、锁信息等相关信
息;而class对象指针则指向该实例的class对象,在开启指针压缩的情况下占用4个字节,否则占8个字节。实例数据:用于存放该对象的实例数据,对于集合对象而言即集合对象的元素对象。内存填充:64位的hotspot要求java对象地址按8字节对齐,即每个对象所占内存的字节数必须是8字节的整数倍,因此java对象通过内存填充来满足对齐要求。
79.步骤s408,根据集合对象占用的内存大小确定是否获取调用栈。
80.作为一种示例,步骤s408中根据集合对象占用的内存大小确定是否获取调用栈,可包括:判断上述集合对象占用的内存大小是否大于或等于预设大小。在上述集合对象占用的内存大小大于或等于预设大小的情况下,确定获取调用栈。可选地,在上述集合对象占用的内存大小小于预设大小的情况下,可结束对本次调用的监测。
81.作为进一步的示例,在上述集合对象占用的内存大小大于或等于预设大小的情况下,进一步判断集合对象占用的内存大小是否呈增长趋势。在集合对象占用的内存大小呈增长趋势的情况下,确定获取调用栈。通过判断集合对象占用的内存大小是否呈增长趋势,可更好的避免频繁获取调用栈,降低监测过程对java应用性能的影响。可选地,在集合对象占用的内存大小并非呈增长趋势的情况下,可结束对本次调用的监测。
82.在确定获取调用栈的情况下,进行步骤s409,获取向集合对象存储元素对象的方法对应的调用栈。作为一种示例,在确定不获取调用栈的情况下,结束对本次调用的监测。
83.步骤s410,将获取的调用栈作为集合对象的监测数据发送至服务端。
84.作为一种实施方式,还包括:将集合对象占用的内存大小作为集合对象的监测数据。发送至服务端的监测数据包括获取的调用栈和集合对象占用的内存大小。作为一种示例,服务端可存储监测数据,监测数据可包括集合对象的信息、获取的调用栈和集合对象占用的内存大小,还可包括获取时间等信息,本实施例对此不作限定。
85.图5示出了根据本公开示例性实施例java虚拟机堆内存集合对象监测方法的又一流程图,下面结合图5描述该java虚拟机堆内存集合对象监测方法。
86.在java中,集合对象通常包括list、map、set、queue及用户自己实现的集合类。例如list、map、set、queue这些类都是接口,实现类有arraylist、hashmap、hashset、linkedqueue等,为了达到对这些集合类的监控,可使用java代理(javaagent)/jvmti技术,对集合类的指定方法进行嵌码,可实现集合类的监控。
87.集合对象本身就是容器,可以存储元素对象,存储元素对象的方法通常是add(object obj)、put(object key,object value)、offer(object obj)等但不限于这些方法,移除元素对象的方法通常是remove、poll等但不限于这些方法。
88.对存储元素对象的方法(add、put和offer等)进行嵌码,以监测向集合对象存储元素对象的操作。监测逻辑主要包括获取集合对象的大小(size)、频率控制器逻辑、获取元素对象占用的内存大小(bytes)、评估集合对象占用的内存大小(bytes)和调用栈获取逻辑等。
89.获取集合对象的大小。通常集合对象都有获取size的方法,这里的size主要是集合对象里元素对象的个数,也不排除其他可以用来获取集合对象的大小的方法。
90.集合对象的大小判断。判断集合对象的大小(size)是否超过了指定的阈值。如果超过了指定的阈值,进行频率控制器逻辑。如果未超过指定的阈值,结束本次监测。
91.频率控制器逻辑。频率控制可减少计算的频繁度,避免过多的计算影响应用的性
能。实现的方式通常有时间窗口控制,调用频次控制:时间窗口控制的方式是只在指定时间内只允许计算一次。调用频次控制:当调用指定次数后允许计算一次。这里不限制其他的实现。
92.频率控制器判断。判断是否满足频率控制器逻辑。如果满足频率控制器逻辑,进行获取元素对象占用的内存大小的过程。如果不满足频率控制器逻辑,结束本次监测。
93.获取元素对象占用的内存大小。java中没有明确的获取元素对象对象的接口,可以借助jvmti、java对象布局管理器(java object layout,简称为jol)等功能来实现。这里以jvmti为例进行说明,借助jvmti中的堆遍历方法followreferences可以遍历指定对象(本文中位集合对象的元素对象)的所有引用,并进行递归遍历计算,可计算出包含对象本身及引用的大小。
94.评估集合对象占用的内存大小。由于每次都计算元素对象占用的内存大小会大大降低java应用的性能,故使用采样出的元素对象占用的内存大小来评估集合对象占用的内存大小,存储对象时的计算公式:预估大小=集合对象本身大小 元素对象的采样平均大小*获取的集合对象的大小。
95.调用栈获取逻辑。获取调用栈逻辑主要是根据预估集合的大小结合配置来判断是否需要获取调用栈,获取调用栈也有性能消耗,而控制性能消耗的逻辑依靠配置来完成,具体逻辑控制依据现实而定。
96.java中可以使用thread.currentthread().getstacktrace()获取调用栈,该方法直接会直接返回当前线程的调用栈。
97.图6示出了根据本公开示例性实施例的java虚拟机堆内存集合对象监测装置的结构框图,如图6所示,java虚拟机堆内存集合对象监测装置可包括:监测模块610、第一确定模块620、第二确定模块630、获取模块640和发送模块650。
98.监测模块610,用于监测向集合对象存储元素对象的方法的调用。第一确定模块620,与监测模块610相连,用于在监测到上述调用的情况下,确定上述集合对象占用的内存大小。第二确定模块630,用于根据上述集合对象占用的内存大小确定是否获取调用栈。获取模块640,与第二确定模块630相连,用于在确定获取调用栈的情况下,获取上述向集合对象存储元素对象的方法对应的调用栈。发送模块650,与获取模块640相连,用于将获取的调用栈作为上述集合对象的监测数据发送至服务端。
99.作为一种实施方式,第一确定模块630确定集合对象占用的内存大小,具体包括:获取集合对象的元素对象数量;获取上述调用存储的元素对象占用的内存大小;根据上述调用存储的元素对象占用的内存大小和至少部分历史调用存储的元素对象占用的内存大小确定元素对象平均大小;根据元素对象平均大小和元素对象数量确定集合对象占用的内存大小。
100.作为一种实施例方式,第一确定模块620在获取上述调用存储的元素对象占用的内存大小之前,还包括:判断是否符合预设策略,其中,该预设策略被配置对部分上述调用进行处理;其中,在符合预设策略的情况下,获取调用存储的元素对象占用的内存大小。
101.作为一种实施例方式,第一确定模块620在判断是否符合预设策略之前,还包括:判断集合对象的元素对象数量是否大于或等于预设数量;其中,在集合对象的元素对象数量大于或等于预设数量的情况下,判断是否符合上述预设策略。
102.作为一种实施例方式,第一确定模块620获取上述调用存储的元素对象占用的内存大小,包括:遍历调用存储的元素对象的所有引用并进行递归遍历计算,得到上述调用存储的元素对象占用的内存大小。
103.作为一种实施例方式,第二确定模块630根据集合对象占用的内存大小确定是否获取调用栈,包括:判断集合对象占用的内存大小是否大于或等于预设大小;在集合对象占用的内存大小大于或等于上述预设大小的情况下,确定获取调用栈。
104.作为一种实施例方式,第二确定模块630还用于在集合对象占用的内存大小大于或等于预设大小的情况下,判断集合对象占用的内存大小是否呈增长趋势;在集合对象占用的内存大小呈增长趋势的情况下,确定获取调用栈。
105.作一种实施方式,发送模块650还用于将集合对象占用的内存大小作为该集合对象的监测数据。
106.通过本公开前述的java虚拟机堆内存集合对象监测方法或装置,可获取到java虚拟机堆内存集合对象的调用栈,以便通过调用栈对内存溢出原因进行分析。下面对本公开的内存溢出分析方法进行描述。
107.图7示出了根据本公开示例性实施例的内存溢出分析方法的流程图,如图7所示,该方法包括步骤s701和步骤s702。
108.步骤s701,接收内存溢出之前的一个或多个集合对象的监测数据。
109.其中,每个集合对象的监测数据包括向集合对象存储元素对象的方法对应的调用栈。
110.步骤s702,对于上述一个或多个集合对象中至少一个集合对象,合并每个集合对象对应的调用栈,以得到每个集合对象对应的调用路径占比。
111.作为一种实施方式,每个集合对象的监测数据还包括集合对象占用的内存大小,内存溢出分析方法还包括:按照集合对象占用的内存大小的最新值,对一个或多个集合对象进行排序;根据排序的结果确定上述至少一个集合对象,以对该至少一个集合对象进行调用栈合并。
112.获取的调用栈是多份数据,经过合并后按照百分比占比就可以发现主要存储对象的代码位置,调用栈路等信息。通常在应用获取一次调用栈快照的结构是从上到下是依次的调用关系,在实际打出来的调用栈是从下到上的调用关系,整理之后是可以变为从上到下的展示。调用栈示例如下:
[0113][0114]
在多次获取调用栈后将多次获取的调用栈进行合并,合并的方式主要是通过对比每次的调用栈的类及方法,如果在从上至下相同的位置是相同的类方法,那么认为是相同的路径,则调用路径上这个类方法的占比就增加了1/n,n为调用栈的数量。
[0115]
下面对示例性的调用栈和调用栈合并结果进行说明。
[0116]
示例性的调用栈1如下:
[0117][0118]
示例性的调用栈2如下:
[0119][0120]
示例性的调用栈3如下:
[0121][0122]
以上有3次获取的调用栈,经过合并得到的占比如下:
[0123][0124]
从以上合并结果看,调用arraylist.add方法的路径上testutil.storeobject2占用66.5%。以上示例的数据只是3次调用栈,在现实应用中的调用栈数量会非常多,当出现内存溢出现象时,通过调用栈就可以知道这些对象都是从哪里加进来的。
[0125]
图8示出了根据本公开示例性实施例的内存溢出分析装置的结构框图,如图8所示,内存溢出分析装置包括:接收模块810,用于接收内存溢出之前的一个或多个集合对象的监测数据,其中,每个集合对象的所述监测数据包括向所述集合对象存储元素对象的方
法对应的调用栈;分析模块820,与接收模块810相连,用于对于一个或多个集合对象中至少一个集合对象,合并每个集合对象对应的调用栈,以得到每个集合对象对应的调用路径占比。
[0126]
作为一种实施方式,每个集合对象的监测数据还包括集合对象占用的内存大小,分析模块820还用于:按照集合对象占用的内存大小的最新值,对一个或多个集合对象进行排序;根据排序的结果确定上述至少一个集合对象,以对该至少一个集合对象进行调用栈合并。
[0127]
本公开示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使电子设备执行根据本公开示例性实施例的方法。
[0128]
本公开示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,计算机程序在被计算机的处理器执行时用于使计算机执行根据本公开示例性实施例的方法。
[0129]
本公开示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开示例性实施例的方法。
[0130]
参考图9,现将描述可以作为本公开的服务器或客户端的电子设备900的结构框图,其是可以应用于本公开的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0131]
如图9所示,电子设备900包括计算单元901,其可以根据存储在只读存储器(rom)902中的计算机程序或者从存储单元908加载到随机访问存储器(ram)903中的计算机程序,来执行各种适当的动作和处理。在ram 903中,还可存储设备900操作所需的各种程序和数据。计算单元901、rom 902以及ram 903通过总线904彼此相连。输入/输出(i/o)接口905也连接至总线904。
[0132]
电子设备900中的多个部件连接至i/o接口905,包括:输入单元906、输出单元907、存储单元908以及通信单元909。输入单元906可以是能向电子设备900输入信息的任何类型的设备,输入单元906可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元907可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元904可以包括但不限于磁盘、光盘。通信单元909允许电子设备900通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙tm设备、wifi设备、wimax设备、蜂窝通信设备和/或类似物。
[0133]
计算单元901可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单
元901的一些示例包括但不限于中央处理单元(cpu)、图形处理单元(gpu)、各种专用的人工智能(ai)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(dsp)、以及任何适当的处理器、控制器、微控制器等。计算单元901执行上文所描述的各个方法和处理。例如,在一些实施例中,java虚拟机堆内存集合对象监测方法或内存溢出分析方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元908。在一些实施例中,计算机程序的部分或者全部可以经由rom 902和/或通信单元909而被载入和/或安装到电子设备900上。在一些实施例中,计算单元901可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行java虚拟机堆内存集合对象监测方法或内存溢出分析方法。
[0134]
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0135]
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0136]
如本公开使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(pld)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
[0137]
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,crt(阴极射线管)或者lcd(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
[0138]
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(lan)、广域网(wan)和互联网。
[0139]
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献