具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图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对它的弱引用,此时堆内存中各模块的引用关系可参见图3b。因此,在模块对象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清除。
本发明实施例提供的业务处理方法,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。
图4a为本发明提供的业务处理方法又一个实施例中模块管理容器向部件返回模块对象的流程图,本实施例中以模块管理容器直接通过弱引用对象调用模块对象对本发明提供的业务处理方法进行说明。该方法具体包括:
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、模块管理容器向部件返回模块对象。
为了保证部件调用模块对象进行业务处理后,模块对外提供的功能弱可达并被虚拟机自动释放,还可以是模块对外提供的功能由模块对象通过弱引用对象间接调用,这种情况下,当部件调用模块对象的接口生成模块对外提供的功能时,弱引用对象间接调用模块对外提供的功能。当部件结束对模块对外提供的功能的使用时,部件对模块对外提供的功能的强引用消失以后,模块对外提供的功能只剩下弱引用对象对它们的弱引用,因此这时模块对外提供的功能是弱可达的,虚拟机可以自动将模块对外提供的功能释放掉。
在业务处理之后,可以判断模块对外提供的功能是否弱可达或者不可达,是则可以将模块对象对外提供的功能清除掉。其中,判断模块对外提供的功能是否弱可达或者不可达,可以参见前一实施例中判断模块模块对象是否已经弱可达或者不可达的过程,在此不再赘述。
本发明实施例提供的业务处理方法,模块对象由模块管理容器通过弱引用对象间接调用,或者模块对象的模块对外提供的功能由模块对象通过弱引用对象间接调用,以使部件调用模块对象进行业务处理之后,模块对象及模块对外提供的功能弱可达并被虚拟机自动释放,从而使模块占用的内存资源能够及时释放,节约了内存资源。
其中,清除模块的过程可以在部件不再使用以后进行的,因此能够确保卸载的安全性,不会对系统中的部件造成功能影响,即解决了内存浪费问题、也解决了安全自动地清除模块问题。另外,模块清除后,模块中使用的类均可以一起释放掉,使得类对象中的静态变量以及静态变量所引用的其它对象也都被释放掉,减轻了由于静态变量使用不当引起的内存泄漏问题。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
图7为本发明提供的Java虚拟机一个实施例的结构示意图,如图7所示,该Java虚拟机包括:模块管理容器1和垃圾收集器2;
其中,模块管理容器1,用于对弱引用对象以及模块对象进行管理,模块对象实现设定的功能,模块管理容器在收到部件的调用设定的功能的请求时,通过弱引用对象调用模块对象,将模块对象返回给部件;
垃圾收集器2,用于在模块对象为弱可达时,清除模块对象。
具体的,模块管理容器1用来管理模块对象的加载,保存模块对象,并保证模块对象可以被其它模块访问,在整个虚拟机系统的生命周期内总是强可达的。
为了保证部件调用模块对象进行业务处理后,模块对象弱可达,进而能够并被垃圾收集器2清除,模块对象管理容器1可以在收到部件调用某种设定功能的请求后,通过模块对象可以由模块管理容器1通过弱引用对象间接持有调用能够实现该设定功能的模块对象,模块管理容器1可以将模块对象对外提供的接口返回给部件,也可以将模块对象对外提供的功能返回给部件进行业务处理。
业务处理后,如果模块对象弱可达,则垃圾收集器2可以将该模块对象清除。具体的:模块管理容器1管理调用模块对象时,可以不直接调用模块对象,而是通过生成一个弱引用对象来调用模块对象。
作为一种可行的实施方式,模块对象在进行业务处理对外服务过程中,即部件使用模块对外提供的功能时,部件可以调用模块对象提供的接口进行业务处理,这种情况下,在部件进行业务处理的过程中,部件对模块对象维持着强引用关系,可参见图3a。当部件业务处理结束后,部件对模块对象的强引用关系消失,而模块对象只剩下弱引用对象对它的弱引用,可参见图3b。因此,在模块对象进行业务处理之后,模块对象可以是弱可达的,垃圾收集器2可以将这些模块对象清除。
作为另一种可行的实施方式,模块对象在进行业务处理对外服务过程中,还可以调用模块对象生成模块对外提供的功能,并通过模块对外提供的功能进行业务处理。这种情况下,在部件进行业务处理的过程中,部件会维持对模块对外提供的功能的强引用关系。在业务处理过程中,可参见图3c,模块对外提供的功能维持对模块对象的强引用,部件又强引用着模块对外提供的功能。由于部件是强可达的,因此,模块对象和模块对外提供的功能都是强可达的。当模块对象结束业务处理时,可参见图3d所示,即部件结束对模块对外提供的功能的使用时,部件对模块对外提供的功能的强引用消失。而模块对象进行业务处理的过程中,模块对外提供的功能对模块对象保持强引用关系,当部件不再需要模块对外提供的功能时,模块对外提供的功能对模块对象的强引用消失(通常可以由代码触发,也可以自动完成的,例如:对象的作用域退出)。模块对象只剩下弱引用对象对它们的弱引用,因此,在模块对象进行业务处理之后,模块对象可以是弱可达的,垃圾收集器2可以将这些模块对象清除。
本发明实施例提供的Java虚拟机,模块管理容器接收部件发出的调用设定功能的请求时,通过弱引用对象调用实现该设定功能的模块对象,部件调用该模块对象进行业务处理之后,若模块对象弱可达,则能够被虚拟机清除,从而使模块占用的内存资源能够及时释放,节约了内存资源。
图8为本发明提供的Java虚拟机又一个实施例的结构示意图,如图8所示,该Java虚拟机包括:模块管理容器1和垃圾收集器2;
本实施例提供的Java虚拟机,还可以包括:
弱引用对象清理器3,用于在模块对象为弱可达时,通知模块管理容器1清除弱引用对象。
进一步的,模块管理容器1还可以用于:通过定义的模块对象的类加载器生成模块对象并向部件返回模块对象。
进一步的,该模块管理容器1还可以用于:以模块对象为参数构造弱引用对象。
进一步的,部件属于模块管理容:1管理的第一模块对象,或者独立于模块管理容器1。
进一步的,模块对象通过调用模块对外提供的功能实现部件调用的功能。
本实施例提供的Java虚拟机,与本发明提供的业务处理方法实施例相对应,为执行业务处理方法的功能设备,其执行业务处理方法的详细过程可参见业务处理方法实施例,在此不再赘述。
本发明实施例提供的Java虚拟机,模块对象由模块管理容器通过弱引用对象间接调用,或者模块对象的模块对外提供的功能由模块对象通过弱引用对象间接调用,以使部件调用模块对象进行业务处理之后,模块对象及模块对外提供的功能弱可达并被虚拟机自动释放,从而使模块占用的内存资源能够及时释放,节约了内存资源。其中,清除模块的过程可以在部件不再使用以后进行的,因此能够确保卸载的安全性,不会对系统中的部件造成功能影响,即解决了内存浪费问题、也解决了安全自动地清除模块问题。另外,模块清除后,模块中使用的类均可以一起释放掉,使得类对象中的静态变量以及静态变量所引用的其它对象也都被释放掉,减轻了由于静态变量使用不当引起的内存泄漏问题。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。