再谈kbmMW垃圾回收
Posted kinglandsoft
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再谈kbmMW垃圾回收相关的知识,希望对你有一定的参考价值。
很早就写了关于kbmMW Server如何实现的垃圾回收,但最近一段时间还是为此遇到问题,实现的Server不能稳定运行,并因此不能响应客户端的查询请求,只能重启Server。这是让人最头的问题,还好,今天终于搞定。
先复习一下早前写过的资料,回顾一下何为kbmMWServer的垃圾回收及实现机制,然后再看我遇到的具体问题。
总结前文,kbmMWServer通过两个属性来控制是否做垃圾回收及定时回收垃圾的时间间隔:
GarbageCollection:是否做垃圾回收
GarbageInterval:回收垃圾的时间间隔,单位是秒
这里的垃圾,是指Service实例。
当客户端发来一个请求时,kbmMWServer会取得一个对应的Service实例来处理该请求,在服务端,kbmMWServer通过池(Pool)来管理Service实例,随着客户端的不断请求及服务端的响应,会在Service实例池中产生多个Service实例,当客户端的请求数量降下来,或者极端的说长时间没有了客户端的请求,那么在服务端的Service实例池中就会有多个不用的实例,因此需要定时的清理、删除,以节省服务器资源。
更具体的说,到底什么样的Service实例需要视为垃圾来清理呢?还是通过代码来说更为明确,找到TkbmMWServiceDefinition类的实现,下面几个属性决定Service实例是否被回收:
TkbmMWServiceDefinition = class(TkbmMWCustomServiceDefinition) public ... property MinCount;//服务端保留的最小Service实例数,小等于这个数时,Service实例不被回收 property MaxIdleTime;//一个Service实例最大的空闲时间,当超过这个时间时,将被回收 property MaxIdleStatefulTime;//一个有状态的Service实例最大的空闲时间,当超过这个时间时,将被回收 property Timeout;//一个Service实例执行时的超时时间,当正在执行时超过这个时间,将被回收 ... end;
当开发者不设置这几个属性,也就是默认情况下:
MinCount为-1,表示在服务端不保留Service实例,所有的Service实例都将做回收处理
MaxIdleTime为0,表示没有空闲的时间,Service实例不会因此而被回收
MaxIdleStatefulTime为0:有状态的Service实例,没有空闲时间,不会因此而被回收
Timeout为0,一个Service实例没有超时时间,不会因此而被回收
以上是关于再谈kbmMW垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段