一种Java虚拟机的垃圾回收方法及其监测系统的制作方法

文档序号:6378644阅读:228来源:国知局
专利名称:一种Java虚拟机的垃圾回收方法及其监测系统的制作方法
技术领域
本发明涉及垃圾回收方法及监测系统技术领域,主要适用于Java虚拟机的垃圾回收方法及其监测系统。
背景技术
目前Java虚拟机中的垃圾回收方法有两种第一是引用计数法;第二是跟踪回收法。对于引用计数法,是通过计算对象的被引用次数来判断该对象是否达到了回收的标准。该方法的弊端有1.不适用于循环引用的情况。若对象C只被对象D引用,而对象D只被对象C引用,则对象C和对象D的被引用次数均为I。按照此方法的回收标准来说,对 象C和对象D都不符合垃圾回收的标准,但Java虚拟机无法访问到对象C和对象D,对象C和对象D都需要被回收。2.对被引用计数的维护开销较大。需要对每个对象的被引用次数进行计数并进行加减运算。对于跟踪回收法,是通过遍历判断哪些对象可达,哪些对象不可达来确定回收的对象。跟踪回收法的弊端为效率较低,导致当前执行程序暂停时间较长。在进行垃圾回收时,当前执行的程序需暂停执行。每次都需要遍历根集下的所有对象,会导致Java虚拟机中当前运行的程序暂停时间较长。若要提高当前程序的运行效率,有两种方法一、当垃圾回收线程在运行时,当前运行程序照常执行(CPU为单核时并发执行,CPU为多核时并行执行)。但是这种方法使得当垃圾回收线程在运行时,当前运行程序会产生新的对象及垃圾对象,从而导致垃圾回收线程变得异常复杂。因为当当前运行程序产生新的对象或垃圾对象时,都会导致垃圾回收线程之前的工作成果变得无效而需要从头开始运行。二、可以多线程执行垃圾回收,这样便缩短了垃圾回收的执行时间,从而将当前执行程序的暂停时间缩短。但此种方法有一个问题需解决,那就是多线程间的信息共享,如哪些对象可达,哪些对象不可达,Java虚拟机中有哪些对象等等。这样又将导致垃圾回收算法复杂度加大。Java虚拟机是由软件虚拟出来的运行在实体计算机上的“机器”,而Java程序就运行在Java虚拟机上。运用引用计数法或跟踪回收法进行垃圾回收时,会有部分垃圾数据无法被回收或回收不及时,从而会导致Java虚拟机的内存空间被大量占用。而Java虚拟机又是运行在实体计算机上的,其内存为实体机内存的一部分,故无法被回收或回收不及时的垃圾数据会占用实体机的内存空间。若实体机的内存空间较小,则未被回收或回收不及时的垃圾数据会导致实体机的内存不够用,从而会降低实体机的运行效率。另外,由于Java应用程序在生产环境中与开发、测试环境不一致,常常导致Java应用程序在开发或测试环境中不会出现的问题在生产环境中出现,如内存泄漏、死循环导致的内存溢出错误。

发明内容
本发明所要解决的技术问题是提供Java虚拟机的垃圾回收方法及其监测系统,它一方面可以对循环引用中的Java程序中的垃圾数据进行高效回收,从而保证了 Java虚拟机所在的实体计算机的运行效率;另一方面可以对Java虚拟机中的垃圾回收情况进行监控,能够了解到Java虚拟机中的垃圾回收线程的运行情况及Java虚拟机的内存情况,以便能更直接、更准确地解决Java虚拟机中所存在的问题,从而提高Java虚拟机的运行效率,进而保证Java虚拟机所在的实体计算机的运行效率。为解决上述技术问题,本发明提供了一种Java虚拟机的垃圾回收方法包括先判断Java虚拟机的根集是否为空;若所述根集为空,则所有对象达到了回收标准;否则对对象A进行判断;具体方法为先判断以所述对象A为链表头的引用链表下是否有对象;
若所述引用链表下无对象,则说明对象A达到了回收标准;若引用链表下有对象B,则通过所述对象B来判断对象A是否能够被根集中的对象引用;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。进一步地,所述通过对象B来判断对象A是否能够被根集中的对象引用包括先判断对象B是否存在于根集中;若所述对象B在根集中,则说明对象B没有达到回收标准,故对象A也没有达到回收标准;否则接着判断对象B是否存在于链表头中,若对象B不在链表头中,则说明对象B没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象C进行判断;若对象B在链表头中,则以对象A为回路对象递归遍历以对象B为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。进一步地,在所述以对象A为回路对象递归遍历以对象B为链表头的引用链表之前,先判断对象B是否为回路对象;若所述对象B是回路对象,则说明对象B所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象C进行判断;若对象B不是回路对象,则以所述对象A为回路对象递归遍历以对象B为链表头的引用链表。进一步地,在所述继续对以链表头为对象A的引用链表中的下一个对象C进行判断包括先判断所述的下一个C对象是否为空;若下一个对象C为空,即下一个对象C不存在,则说明对以对象A为链表头的引用链表遍历完毕,而对象A不能被根集中的对象引用,故对象A达到了回收标准;若下一个对象C不为空,则先判断下一个对象C是否存在于根集中;若下一个对象C在根集中,则说明下一个对象C没有达到回收标准,故对象A也没有达到回收标准;否则接着判断下一个对象C是否存在于链表头中,若下一个对象C不在链表头中,则说明下一个对象C没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C在链表头中,先判断下一个对象C是否为回路对象;若下一个对象C是回路对象,则说明下一个对象C所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C不是回路对象,则以对象A为回路对象递归遍历以下一个对象C为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。本发明还提供了一种Java虚拟机的垃圾回收方法的监测系统包括输入设备、控制器、存储器及通讯组件;所述输入设备和所述存储器各自分别与所述控制器连接;控制器通过所述通讯组件与Java虚拟机连接。进一步地,还包括运算器;所述运算器分别与所述存储器、所述控制器连接。进一步地,还包括显示设备;所述显 示设备与所述控制器连接。本发明的有益效果在于本发明的提供Java虚拟机的垃圾回收方法及其监测系统在一方面可以对循环引用中的Java程序中的垃圾数据进行高效回收,从而保证了 Java虚拟机所在的实体计算机的运行效率;另一方面可以对Java虚拟机中的垃圾回收情况进行监控,能够了解到Java虚拟机中的垃圾回收线程的运行情况及Java虚拟机的内存情况,以便能更直接、更准确地解决Java虚拟机中所存在的问题,从而提高Java虚拟机的运行效率,进而保证Java虚拟机所在的实体计算机的运行效率。本发明结构合理、效果显著、实用性强。


图I为本发明提供的Java虚拟机的垃圾回收方法的流程图。图2为本发明提供的Java虚拟机的垃圾回收方法的监测系统的结构框图。
具体实施例方式为进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的Java虚拟机的垃圾回收方法及其监测系统的具体实施方式
及工作原理进行详细说明。由图I可知,本发明提供的Java虚拟机的垃圾回收方法包括先判断Java虚拟机的根集是否为空;若根集为空,则所有对象达到了回收标准;否则对Java虚拟机中的对象A进行判断;具体方法为先判断以对象A为链表头的引用链表下是否有对象,即对象A对应的引用链表是否为空;若引用链表下无对象,则说明对象A达到了回收标准;若引用链表下有对象B,则通过对象B来判断对象A是否能够被根集中的对象引用;具体方法为先判断对象B是否存在于根集中;若对象B在根集中,则说明对象B没有达到回收标准,故对象A也没有达到回收标准;若对象B不在根集中,再判断对象B是否存在于链表头中;若对象B不在链表头中,则说明对象B没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象C进行判断;具体的,先判断的下一个C对象是否为空;若下一个对象C为空,即下一个对象C不存在,则说明对以对象A为链表头的引用链表遍历完毕,而对象A不能被根集中的对象引用,故对象A达到了回收标准;若下一个对象C不为空,则先判断下一个对象C是否存在于根集中;若下一个对象C在根集中,则说明下一个对象C没有达到回收标准,故对象A也没有达到回收标准;否则接着判断下一个对象C是否存在于链表头中,若下一个对象C不在链表头中,则说明下一个对象C没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C在链表头中,先判断下一个对象C是否为回路对象;若下一个对象C是回路对象,则说明下一个对象C所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C不是回路对象,则以对象A为回路对象递归遍历以下一个对象C为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。若对象B在链表头中,先判断对象B是否为回路对象;若对象B是回路对象,则说明对象B所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象C进行判断;具体的,先判断的下一个C对象是否为空;若下一个对象C为空,即下一个对象C不存在,则说明对以对象A为链表头的引用链表遍历完毕,而对象A不能被根集中的对象引·用,故对象A达到了回收标准;若下一个对象C不为空,则先判断下一个对象C是否存在于根集中;若下一个对象C在根集中,则说明下一个对象C没有达到回收标准,故对象A也没有达到回收标准;否则接着判断下一个对象C是否存在于链表头中,若下一个对象C不在链表头中,则说明下一个对象C没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C在链表头中,先判断下一个对象C是否为回路对象;若下一个对象C是回路对象,则说明下一个对象C所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C不是回路对象,则以对象A为回路对象递归遍历以下一个对象C为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。若对象B不是回路对象,则以对象A为回路对象递归遍历以对象B为链表头的引用链;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。本发明提供的Java虚拟机的垃圾回收方法的监测系统,包括输入设备、控制器、运算器、存储器、显示设备及通讯组件;输入设备、运算器、显示设备及存储器各自分别与控制器连接;运算器还与存储器连接;控制器通过通讯组件与目标Java虚拟机连接。具体的,由图2可知,输入设备通过I/O接口电路与数据总线连接,以输入数据;通过I/o接口电路与控制总线相连,以接受控制器的控制信号。显示设备通过I/O接口电路与数据总线连接,以输出数据;通过I/O接口电路与控制总线相连,以接受控制器的控制信号。运算器直接与数据总线相连,既可接受数据,又可输出数据;又与地址总线相连,以通过地址总线找到地址对应的数据。控制器与数据总线、地址总线及控制总线相连。从数据总线可以接受数据;从地址总线可以找到地址对应数据;从控制总线可以发出控制信号到其他部件。存储器与数据总线、地址总线及控制总线相连。从数据总线既可以输入数据,也可以输出数据;从地址总线,可以接受按地址查询数据的请求;从控制总线可以接受控制信号。通讯组件与数据总线、控制总线相连。从数据总线可得到数据,也可以输出数据到数据总线;从控制总线可以接受发出通讯的控制信号。通过本发明提供的Java虚拟机的垃圾回收方法对Java虚拟机中的垃圾进行回收,首先判断Java虚拟机的根集是否为空;若根集为空,则所有对象达到了回收标准;否则对Java虚拟机中的对象A进行判断;具体方法为先判断以对象A为链表头的引用链表下是否有对象;若引用链表下无对象,则说明对象A达到了回收标准;若引用链表下有对象B,则通过对象B来判断对象A是否能够被根集中的对象引用;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。通过此方法,可以判断Java虚拟机中的其他对象是否达到回收标准。
通过本发明提供的Java虚拟机的垃圾回收方法的监测系统可以对Java虚拟机的垃圾回收情况进行监控,以查询Java虚拟机中的根集为例。首先用户通过输入设备输入要查询目标Java虚拟机中根集的指令;查询指令到达控制器后,控制器对接收到的指令进行解析。再通过通讯组件将查询指令发送到目标Java虚拟机,再得到由目标Java虚拟机返回的数据。控制器再通过显示设备将目标Java虚拟机的根集情况显示出来。需要说明的是,若由目标Java虚拟机返回的数据需要做进一步处理时,控制器先将返回的数据放置在存储器中,再命令运算器对存储器中的数据进行运算,从而得出结果数据,再将得到的结果数据返回到控制器,并通过显示设备显示出来。通过本发明提供的Java虚拟机的垃圾回收方法的监控系统可以远程监控Java虚拟机中存在的根集、所有对象、所有对象的引用链表,由此可知哪些对象是应该回收但没有回收的,从而优化程序代码,进而避免了内存泄漏的情况;另外,若Java虚拟机发生内存溢出错误,可以通过返回的数据信息发现是哪段程序代码出现了问题,再修改漏洞,从而提高了 Java虚拟机的运行效率,进而能够保证Java虚拟机所在的实体计算机的运行效率。本发明提供的Java虚拟机的垃圾回收方法一方面不考虑Java虚拟机中的死循环回路的情况,再通过对Java虚拟机中的对象的引用链表进行递归遍历来判断Java虚拟机中的对象是否能被根集中的对象引用,从而得出Java虚拟机中的对象是否达到回收标准的结论,实现了对循环引用中的垃圾数据的回收;另一方面,本发明通过先判断对象的引用链表是否为空,可处理大部分情况,而后再对循环引用及长引用的情况进行处理,这样不需要每次对所有对象进行遍历,从而提高了 Java虚拟机中垃圾回收的效率,从而提高了 Java虚拟机的运行效率,进而保证了 Java虚拟机所在的实体计算机的运行效率。本发明提供的Java虚拟机的垃圾回收方法的监测系统可以对Java虚拟机中的垃圾回收情况进行监控,能够了解到Java虚拟机中的垃圾回收线程的运行情况及Java虚拟机的内存情况,以便能更直接、更准确地解决Java虚拟机中所存在的问题,从而提高Java虚拟机的运行效率,进而保证了 Java虚拟机所在的实体计算机的运行效率。本发明结构合理、效果显著、实用性强。最后所应说明的是,以上具体实施方式
仅用以说明本发明的技术方案而非限制,尽管参照实例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种Java虚拟机的垃圾回收方法,其特征在于,包括 先判断Java虚拟机的根集是否为空; 若所述根集为空,则所有对象达到了回收标准;否则对对象A进行判断;具体方法为 先判断以所述对象A为链表头的引用链表下是否有对象; 若所述引用链表下无对象,则说明对象A达到了回收标准; 若引用链表下有对象B,则通过所述对象B来判断对象A是否能够被根集中的对象引用; 若对象A能被根集中的对象引用,则说明对象A没有达到回收标准; 若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。
2.如权利要求I所述的Java虚拟机的垃圾回收方法,其特征在于,所述通过对象B来判断对象A是否能够被根集中的对象引用包括先判断对象B是否存在于根集中;若所述对象B在根集中,则说明对象B没有达到回收标准,故对象A也没有达到回收标准;否则接着判断对象B是否存在于链表头中,若对象B不在链表头中,则说明对象B没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象C进行判断;若对象B在链表头中,则以对象A为回路对象递归遍历以对象B为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。
3.如权利要求2所述的Java虚拟机的垃圾回收方法,其特征在于,在所述以对象A为回路对象递归遍历以对象B为链表头的引用链表之前,先判断对象B是否为回路对象; 若所述对象B是回路对象,则说明对象B所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象C进行判断; 若对象B不是回路对象,则以所述对象A为回路对象递归遍历以对象B为链表头的引用链表。
4.如权利要求3所述的Java虚拟机的垃圾回收方法,其特征在于,在所述继续对以链表头为对象A的引用链表中的下一个对象C进行判断包括先判断所述的下一个C对象是否为空; 若下一个对象C为空,即下一个对象C不存在,则说明对以对象A为链表头的引用链表遍历完毕,而对象A不能被根集中的对象引用,故对象A达到了回收标准; 若下一个对象C不为空,则先判断下一个对象C是否存在于根集中;若下一个对象C在根集中,则说明下一个对象C没有达到回收标准,故对象A也没有达到回收标准;否则接着判断下一个对象C是否存在于链表头中,若下一个对象C不在链表头中,则说明下一个对象C没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C在链表头中,先判断下一个对象C是否为回路对象;若下一个对象C是回路对象,则说明下一个对象C所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C不是回路对象,则以对象A为回路对象递归遍历以下一个对象C为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。
5.如权利要求3所述的Java虚拟机的垃圾回收方法,其特征在于,在所述继续对以链表头为对象A的引用链表中的下一个对象C进行判断包括先判断所述的下一个C对象是否为空;若下一个对象C为空,即下一个对象C不存在,则说明对以对象A为链表头的引用链表遍历完毕,而对象A不能被根集中的对象引用,故对象A达到了回收标准;若下一个对象C不为空,则先判断下一个对象C是否存在于根集中;若下一个对象C在根集中,则说明下一个对象C没有达到回收标准,故对象A也没有达到回收标准;否则接着判断下一个对象C是否存在于链表头中,若下一个对象C不在链表头中,则说明下一个对象 C没有被任何对象引用;并继续对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C在链表头中,先判断下一个对象C是否为回路对象;若下一个对象C是回路对象,则说明下一个对象C所在的引用回路为死循环,再对以链表头为对象A的引用链表中的下一个对象D进行判断;若下一个对象C不是回路对象,则以对象A为回路对象递归遍历以下一个对象C为链表头的引用链表;若对象A能被根集中的对象引用,则说明对象 A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。
6.一种基于如权利要求1-5中任意一项所述的Java虚拟机的垃圾回收方法的监测系统,其特征在于,包括输入设备、控制器、存储器及通讯组件;所述输入设备和所述存储器各自分别与所述控制器连接;控制器通过所述通讯组件与Java虚拟机连接。
7.如权利要求6所述的Java虚拟机的垃圾回收方法的监测系统,其特征在于,还包括 运算器;所述运算器分别与所述存储器、所述控制器连接。
8.如权利要求6所述的Java虚拟机的垃圾回收方法的监测系统,其特征在于,还包括 显示设备;所述显示设备与所述控制器连接。
全文摘要
本发明涉及垃圾回收方法及监测系统技术领域,公开了一种Java虚拟机的垃圾回收方法及其监测系统。该方法包括先判断Java虚拟机的根集是否为空;若根集为空,则所有对象达到了回收标准;否则对对象A进行判断;具体方法为先判断以对象A为链表头的引用链表下是否有对象;若引用链表下无对象,则说明对象A达到了回收标准;若引用链表下有对象B,则通过对象B来判断对象A是否能够被根集中的对象引用;若对象A能被根集中的对象引用,则说明对象A没有达到回收标准;若对象A不能被根集中的对象引用,则说明对象A达到了回收标准。本发明可以对循环引用中的Java程序中的垃圾数据进行高效回收。
文档编号G06F9/46GK102929699SQ20121038466
公开日2013年2月13日 申请日期2012年10月10日 优先权日2012年10月10日
发明者田新华 申请人:武汉钢铁(集团)公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1