再谈kbmMW垃圾回收

Posted kinglandsoft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再谈kbmMW垃圾回收相关的知识,希望对你有一定的参考价值。

很早就写了关于kbmMW Server如何实现的垃圾回收,但最近一段时间还是为此遇到问题,实现的Server不能稳定运行,并因此不能响应客户端的查询请求,只能重启Server。这是让人最头的问题,还好,今天终于搞定。

先复习一下早前写过的资料,回顾一下何为kbmMWServer的垃圾回收及实现机制,然后再看我遇到的具体问题。

kbmMWServer垃圾回收处理机制(一)

kbmMWServer垃圾回收处理机制(二)

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”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

垃圾收集器与内存分配策略

Java 垃圾回收 - 收集算法

Java虚拟机15:再谈四种引用状态

JVM垃圾回收器之G1(Garbage First)--new

java中垃圾回收机制的原理