业务处理方法和Java虚拟机的制作方法

文档序号:6429337阅读:164来源:国知局
专利名称:业务处理方法和Java虚拟机的制作方法
技术领域
本发明涉及计算机技术领域,特别涉及一种业务处理方法和Java虚拟机。
背景技术
在采用Java或其他编程语言的虚拟机中,虚拟机根据垃圾收集算法判断内存是否可以释放,判断的方法是对象的可达性,如果对象是可达的则不可以释放,如果对象是不可达的则需要释放。在虚拟机运行时,从引用根集(Root set of references)通过直接或间接方式引用到的对象是可达对象,其它对象是不可达对象。不可达的对象就是垃圾,需要回收以释放内存。通常以“Root set of references”作为垃圾回收的起点,能够遍历得到的对象就是可达的,遍历不到的对象就是不可达的。其中,“Root set of references”是一个集合, 即可以作为垃圾回收的起点有多个,但最主要的起点是活动线程的栈和系统类加载器,一般可以以静态变量作为垃圾收集的起点。现有技术中,程序中的模块会在首次使用时加载并初始化,在整个虚拟机的生命周期内一直存活直到进程关闭。模块加载以后占用的堆内存资源、模块类占用的永久段内存资源不会适时释放,导致虚拟机消耗的内存随着使用功能的增多而不断增长,部分模块在执行的所有线程退出后几毫秒至几天甚至几年释放才能释放,造成内存资源浪费。

发明内容
本发明实施例提供了一种业务处理方法和Java虚拟机,以解决现有的模块卸载方法浪费内存资源的问题。本发明实施例提供一种业务处理方法,包括接收部件的调用某个功能的请求,通过弱引用对象调用实现所述功能的模块对象;将所述模块对象返回给所述部件以进行业务处理;判断所述模块对象是否弱可达,若为是,则清除所述模块对象。本发明实施例还提供一种Java虚拟机,包括模块管理容器,用于对弱引用对象以及模块对象进行管理,所述模块对象实现设定的功能,所述模块管理容器在收到部件的调用所述设定的功能的请求时,通过所述弱引用对象调用所述模块对象,将所述模块对象返回给所述部件;垃圾收集器,用于在所述模块对象为弱可达时,清除所述模块对象。本发明实施例提供的业务处理方法和Java虚拟机,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明提供的业务处理方法一个实施例的流程图;图2为本发明实施例提供的业务处理方法涉及的堆内存的结构示意图;图3a为图1所示实施例的一种业务处理过程中堆内存中各模块的引用关系图;图北为图1所示实施例的一种业务处理之后堆内存中各模块的引用关系图;图3c为图1所示实施例的又一种业务处理过程中堆内存中各模块的引用关系图;图3d为图1所示实施例的又一种业务处理之后堆内存中各模块的引用关系图;图如为本发明提供的业务处理方法又一个实施例中模块管理容器向部件返回模块对象的流程图;图4b为本发明提供的业务处理方法又一个实施例中部件调用模块对象进行业务处理的流程图;图5为图如和图4b所示实施例的业务处理过程中堆内存和永久段中各模块的引用关系图;图6为本发明提供的业务处理方法另一个实施例中模块管理容器向部件返回模块对象的流程图;图7为本发明提供的Java虚拟机一个实施例的结构示意图;图8为本发明提供的Java虚拟机又一个实施例的结构示意图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。图1为本发明提供的业务处理方法一个实施例的流程图,如图1所示,该方法包括S101、接收部件的调用某个功能的请求,通过弱引用对象调用实现该功能的模块对象。S102、将该模块对象返回给该部件以进行业务处理。S103、判断该模块对象是否弱可达,若为是,则执行S104,否则流程结束。S104、清除该模块对象。本发明实施例提供的业务处理方法,可以在Java程序中应用,还可以在使用垃圾收集回收内存,并支持弱引用的其他编程语言中应用。图2为本实施例提供的业务处理方法涉及的堆内存的结构示意图,如图2所示,其中,模块管理容器A用来管理模块对象B的加载,保存模块对象B,并保证模块对象B可以被其它模块访问,在整个虚拟机系统的生命周期内总是强可达的。模块对象B在虚拟机系统中用于实现某种特定功能,整个虚拟机系统中可能包括很多个模块对象B,模块对象B能够被模块管理容器A加载和管理。本发明实施例中涉及的部件C,可以是虚拟机系统中的任一部件,具体可以是被模块管理容器A管理的模块对象B,也可以独立于模块管理容器A,部件C通过调用能够实现不同特定功能的模块对象B来进行相应的业务处理。为了保证部件C调用模块对象B进行业务处理后,模块对象B弱可达,进而能够并被虚拟机清除,模块对象管理容器A可以在收到部件C调用某种设定功能的请求后,通过模块对象B可以由模块管理容器A通过弱引用对象间接持有调用能够实现该设定功能的模块对象B,模块管理容器A可以将模块对象B对外提供的接口返回给部件C,也可以将模块对象对外提供的功能D返回给部件进行业务处理。业务处理后,如果模块对象B弱可达,则虚拟机系统可以将该模块对象B清除。具体的模块管理容器A调用模块对象B时,可以不直接调用模块对象B,而是通过生成一个弱引用对象E来调用模块对象B。作为一种可行的实施方式,模块对象B在进行业务处理对外服务过程中,即部件C 使用模块对外提供的功能D时,部件C可以调用模块对象B提供的接口进行业务处理,这种情况下,在部件C进行业务处理的过程中,部件C对模块对象B维持着强引用关系,堆内存中各模块的引用关系可参见图3a。当部件C业务处理结束后,部件C对模块对象B的强引用关系消失,而模块对象B只剩下弱引用对象E对它的弱引用,此时堆内存中各模块的引用关系可参见图北。因此,在模块对象B进行业务处理之后,模块对象B可以是弱可达的,虚拟机可以将这些模块对象B清除。作为另一种可行的实施方式,模块对象B在进行业务处理对外服务过程中,还可以调用模块对象B生成模块对外提供的功能D,并通过模块对外提供的功能D进行业务处理。这种情况下,在部件C进行业务处理的过程中,部件C会维持对模块对外提供的功能D 的强引用关系。在业务处理过程中,堆内存中各模块的引用关系可参见图3c,模块对外提供的功能D维持对模块对象B的强引用,部件C又强引用着模块对外提供的功能D。由于部件 C是强可达的,因此,模块对象B和模块对外提供的功能D都是强可达的。当模块对象B结束业务处理时,对内存中各模块之间的引用关系如图3d所示,即部件C结束对模块对外提供的功能D的使用时,部件C对模块对外提供的功能D的强引用消失。而模块对象B进行业务处理的过程中,模块对外提供的功能D对模块对象B保持强引用关系,当部件C不再需要模块对外提供的功能D时,模块对外提供的功能D对模块对象B的强引用消失(通常可以由代码触发,也可以自动完成的,例如对象的作用域退出)。模块对象B只剩下弱引用对象E对它们的弱引用,因此,在模块对象B进行业务处理之后,模块对象B可以是弱可达的,虚拟机可以将这些模块对象B清除。本发明实施例提供的业务处理方法,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。图如为本发明提供的业务处理方法又一个实施例中模块管理容器向部件返回模块对象的流程图,本实施例中以模块管理容器直接通过弱引用对象调用模块对象对本发明提供的业务处理方法进行说明。该方法具体包括S201、模块管理容器接收部件发送的调用某个功能的请求;S202、模块管理容器查看是否保存了对应的弱引用对象;是,则执行S203,否则执行 S205 ;S203、通过弱引用对象来调用模块对象;S204、判断取得的模块对象是否为空(即,判断是否存在实现该功能的模块对象);是,则执行S205,否则执行S209 ;S205、为模块对象和模块对外提供的功能定义模块对象的类加载器;使模块对象范围内所有的类都由这个类加载器加载;S206、通过定义的模块对象的类加载器生成模块对象;S207、以模块对象为传入参数生成一个新的弱引用对象(java. lang. ref. WeakReference);S208、模块管理容器保存生成的弱引用对象以便后续请求复用;
S209、模块管理容器向部件返回模块对象。图4b为本发明提供的业务处理方法又一个实施例中部件调用模块对象进行业务处理的流程图,该方法具体包括S210、部件调用模块对象提供的接口进行业务处理;S211、部件通过调用模块接口对象生成模块对外提供的功能;S212、模块对象构造功能对象;S213、模块对外提供的功能向部件返回模块对外提供的功能对象;S214、部件通过模块对外提供的功能对象进行业务处理。在此过程中,部件会维持对模块对象或者模块对外提供的功能的强引用关系。其中,部件可以调用模块对象提供的接口进行业务处理;和/或,调用模块对象生成模块对外提供的功能,并通过模块对外提供的功能进行业务处理。S215、部件的业务处理完成后,部件对模块对象或模块对象对外提供的功能的强引用关系就会被切断。其中,切断操作可以由代码触发,也可以自动完成。部件对模块对象或模块对象对外提供的功能的强引用关系被切断后,模块对象和模块对外提供的功能变成弱可达,进而可以被清除。进一步的,业务处理过程中,虚拟机中的堆内存和永久段中各模块的引用关系如图5所示,模块对象的各个类F被模块对象B和模块对象对外提供的功能D强引用着,模块对象的各个类F与模块对象的类加载器G相互强引用,模块对象的各个类F对模块静态变量用到的其他对象H强引用。在业务处理后,由于模块对象B是由自定义的模块对象的类加载器G加载的,当模块对象B和模块对外提供的功能D是强可达时,模块对象的类加载器G和模块对象的各个类F都是强可达的。但当模块对象B和模块对外提供的功能D是弱可达时,则模块对象的类加载器G、模块对象的各个类F和模块静态变量用到的其它对象H都是弱可达的,因此,同样可以被虚拟机释放掉。
进一步的,当部件的业务处理完成后,还可以对弱引用对象进行清除。其中,判断模块对象是否已经弱可达或者不可达了的实现方法有多种,可以遍历模块管理容器中的所有弱引用对象,逐个检测是否为空(null),如果为null则说明对应的模块已经是弱可达或者不可达了。还可以在生成弱引用对象时,通过传入参数指定引用队列(java. lang.ref. ReferenceQueue),然后调用引用队列的remove ()函数来取得被引用对象已经释放了的弱引用对象。remove ()这个函数的特性是如果队列中的有已经释放了对象的弱引用对象则返回它、如果没有则将当前线程休眠直到虚拟机发现有新的弱引用对象加入队列才会重新唤醒当前线程。图6为本发明提供的业务处理方法另一个实施例中模块管理容器向部件返回模块对象的流程图,如图6所示,本实施例与前一实施例的区别在于模块管理容器收到部件发出的调用某个功能的请求后,可以通过弱引用对象调用模块对象的模块对象对外提供的功能。该方法具体包括S301、模块管理容器接收部件发送的调用某个功能的请求;S302、模块管理容器查看是否保存了对应的模块对象;是,则执行S306,否则执行 S303-S306 ;S303、模块管理容器为模块对象和模块对外提供的功能定义模块对象的类加载器,使模块对象范围内所有的类都由这个类加载器加载;S304、模块管理容器通过模块对象的类加载器生成模块对象;S305、模块管理容器保存模块对象以便后续请求复用;S306、模块管理容器向部件返回模块对象。为了保证部件调用模块对象进行业务处理后,模块对外提供的功能弱可达并被虚拟机自动释放,还可以是模块对外提供的功能由模块对象通过弱引用对象间接调用,这种情况下,当部件调用模块对象的接口生成模块对外提供的功能时,弱引用对象间接调用模块对外提供的功能。当部件结束对模块对外提供的功能的使用时,部件对模块对外提供的功能的强引用消失以后,模块对外提供的功能只剩下弱引用对象对它们的弱引用,因此这时模块对外提供的功能是弱可达的,虚拟机可以自动将模块对外提供的功能释放掉。在业务处理之后,可以判断模块对外提供的功能是否弱可达或者不可达,是则可以将模块对象对外提供的功能清除掉。其中,判断模块对外提供的功能是否弱可达或者不可达,可以参见前一实施例中判断模块模块对象是否已经弱可达或者不可达的过程,在此不再赘述。本发明实施例提供的业务处理方法,模块对象由模块管理容器通过弱引用对象间接调用,或者模块对象的模块对外提供的功能由模块对象通过弱引用对象间接调用,以使部件调用模块对象进行业务处理之后,模块对象及模块对外提供的功能弱可达并被虚拟机自动释放,从而使模块占用的内存资源能够及时释放,节约了内存资源。其中,清除模块的过程可以在部件不再使用以后进行的,因此能够确保卸载的安全性,不会对系统中的部件造成功能影响,即解决了内存浪费问题、也解决了安全自动地清除模块问题。另外,模块清除后,模块中使用的类均可以一起释放掉,使得类对象中的静态变量以及静态变量所引用的其它对象也都被释放掉,减轻了由于静态变量使用不当引起的内存泄漏问题。
7
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory, ROM)或随机存储记忆体(Random Access Memory, RAM)等。图7为本发明提供的Java虚拟机一个实施例的结构示意图,如图7所示,该Java 虚拟机包括模块管理容器1和垃圾收集器2 ;其中,模块管理容器1,用于对弱引用对象以及模块对象进行管理,模块对象实现设定的功能,模块管理容器在收到部件的调用设定的功能的请求时,通过弱引用对象调用模块对象,将模块对象返回给部件;垃圾收集器2,用于在模块对象为弱可达时,清除模块对象。具体的,模块管理容器1用来管理模块对象的加载,保存模块对象,并保证模块对象可以被其它模块访问,在整个虚拟机系统的生命周期内总是强可达的。为了保证部件调用模块对象进行业务处理后,模块对象弱可达,进而能够并被垃圾收集器2清除,模块对象管理容器1可以在收到部件调用某种设定功能的请求后,通过模块对象可以由模块管理容器1通过弱引用对象间接持有调用能够实现该设定功能的模块对象,模块管理容器1可以将模块对象对外提供的接口返回给部件,也可以将模块对象对外提供的功能返回给部件进行业务处理。业务处理后,如果模块对象弱可达,则垃圾收集器2可以将该模块对象清除。具体的模块管理容器1管理调用模块对象时,可以不直接调用模块对象,而是通过生成一个弱引用对象来调用模块对象。作为一种可行的实施方式,模块对象在进行业务处理对外服务过程中,即部件使用模块对外提供的功能时,部件可以调用模块对象提供的接口进行业务处理,这种情况下, 在部件进行业务处理的过程中,部件对模块对象维持着强引用关系,可参见图3a。当部件业务处理结束后,部件对模块对象的强引用关系消失,而模块对象只剩下弱引用对象对它的弱引用,可参见图北。因此,在模块对象进行业务处理之后,模块对象可以是弱可达的,垃圾收集器2可以将这些模块对象清除。作为另一种可行的实施方式,模块对象在进行业务处理对外服务过程中,还可以调用模块对象生成模块对外提供的功能,并通过模块对外提供的功能进行业务处理。这种情况下,在部件进行业务处理的过程中,部件会维持对模块对外提供的功能的强引用关系。 在业务处理过程中,可参见图3c,模块对外提供的功能维持对模块对象的强引用,部件又强引用着模块对外提供的功能。由于部件是强可达的,因此,模块对象和模块对外提供的功能都是强可达的。当模块对象结束业务处理时,可参见图3d所示,即部件结束对模块对外提供的功能的使用时,部件对模块对外提供的功能的强引用消失。而模块对象进行业务处理的过程中,模块对外提供的功能对模块对象保持强引用关系,当部件不再需要模块对外提供的功能时,模块对外提供的功能对模块对象的强引用消失(通常可以由代码触发,也可以自动完成的,例如对象的作用域退出)。模块对象只剩下弱引用对象对它们的弱引用, 因此,在模块对象进行业务处理之后,模块对象可以是弱可达的,垃圾收集器2可以将这些模块对象清除。
本发明实施例提供的Java虚拟机,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。图8为本发明提供的Java虚拟机又一个实施例的结构示意图,如图8所示,该 Java虚拟机包括模块管理容器1和垃圾收集器2 ;本实施例提供的Java虚拟机,还可以包括弱引用对象清理器3,用于在模块对象为弱可达时,通知模块管理容器1清除弱引用对象。进一步的,模块管理容器1还可以用于通过定义的模块对象的类加载器生成模块对象并向部件返回模块对象。进一步的,该模块管理容器1还可以用于以模块对象为参数构造弱引用对象。进一步的,部件属于模块管理容1管理的第一模块对象,或者独立于模块管理容器Io进一步的,模块对象通过调用模块对外提供的功能实现部件调用的功能。本实施例提供的Java虚拟机,与本发明提供的业务处理方法实施例相对应,为执行业务处理方法的功能设备,其执行业务处理方法的详细过程可参见业务处理方法实施例,在此不再赘述。本发明实施例提供的Java虚拟机,模块对象由模块管理容器通过弱引用对象间接调用,或者模块对象的模块对外提供的功能由模块对象通过弱引用对象间接调用,以使部件调用模块对象进行业务处理之后,模块对象及模块对外提供的功能弱可达并被虚拟机自动释放,从而使模块占用的内存资源能够及时释放,节约了内存资源。其中,清除模块的过程可以在部件不再使用以后进行的,因此能够确保卸载的安全性,不会对系统中的部件造成功能影响,即解决了内存浪费问题、也解决了安全自动地清除模块问题。另外,模块清除后,模块中使用的类均可以一起释放掉,使得类对象中的静态变量以及静态变量所引用的其它对象也都被释放掉,减轻了由于静态变量使用不当引起的内存泄漏问题。最后应说明的是以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
权利要求
1.一种Java虚拟机,其特征在于,包括模块管理容器,用于对弱引用对象以及模块对象进行管理,所述模块对象实现设定的功能,所述模块管理容器在收到部件的调用所述设定的功能的请求时,通过所述弱引用对象调用所述模块对象,将所述模块对象返回给所述部件;垃圾收集器,用于在所述模块对象为弱可达时,清除所述模块对象。
2.根据权利要求1所述的Java虚拟机,其特征在于,所述Java虚拟机还包括弱引用对象清理器,用于在所述模块对象为弱可达时,通知所述模块管理容器清除所述弱引用对象。
3.根据权利要求1所述的Java虚拟机,其特征在于,所述模块管理容器还用于通过定义的模块对象的类加载器生成所述模块对象并向所述部件返回所述模块对象。
4.根据权利要求3所述的Java虚拟机,其特征在于,所述模块管理容器还用于以所述模块对象为参数构造所述弱引用对象。
5.根据权利要求1所述的Java虚拟机,其特征在于,所述部件属于所述模块管理容器管理的第一模块对象,或者独立于所述模块管理容器。
6.根据权利要求1所述的Java虚拟机,其特征在于,所述模块对象通过调用模块对外提供的功能实现所述部件调用的功能。
7.一种业务处理方法,其特征在于,包括接收部件的调用某个功能的请求,通过弱引用对象调用实现所述功能的模块对象;将所述模块对象返回给所述部件以进行业务处理;判断所述模块对象是否弱可达,若为是,则清除所述模块对象。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括判断是否存在所述模块对象,若不存在,则通过定义的模块对象的类加载器生成所述模块对象并向所述部件返回所述模块对象。
9.根据权利要求7或8所述的方法,其特征在于,所述方法还包括判断是否存在所述弱引用对象,若不存在所述所引用对象,则以所述模块对象为参数构造所述弱引用对象。
10.根据权利要求7所述的方法,其特征在于,所述将所述模块对象返回给所述部件以进行业务处理具体包括将所述模块对象对外提供的接口返回给所述部件,或者将所述模块对象的模块对外提供的功能返回给所述部件。
全文摘要
本发明实施例提供一种业务处理方法和Java虚拟机。方法包括接收部件的调用某个功能的请求,通过弱引用对象调用实现所述功能的模块对象;将所述模块对象返回给所述部件以进行业务处理;判断所述模块对象是否弱可达,若为是,则清除所述模块对象。本发明实施例提供的业务处理方法和Java虚拟机,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。
文档编号G06F9/455GK102253854SQ201110210849
公开日2011年11月23日 申请日期2011年7月26日 优先权日2011年7月26日
发明者梁孔荣 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1