MemoryAwareThreadPoolExecutor和OrderMemoryAwareThreadPoolExecutor,昨晚有个有个小子说OrderMemoryAwareThreadPoolExecutor处理有顺序的数据这个是有利的,我说,一般处理数据量,会做一个排队,所以没有必要,并且OrderMemoryAwareThreadPoolExecutor在A事件没有处理完毕那么,B 事件是不会被处理,会被阻塞!我做了一个测试。在1K的并发,使用OrderMemoryAwareThreadPoolExecutor,结果我的解码器,handler和excuterhandle,对象虽然在ppiple对象中被回收,这里是在hash中调用的remove(),看源码就知道了,但是实际的实体对象没有被回收,通过jprofiler对象观察到,并且我的ps old gen 峰值达到了500m,尼玛,这是前所未有的,虽然被GC回收,但是这里频繁了GC,后来换回MemoryAwareThreadPoolExecutor测试,ps old gen 没有超过50M,估计只有10M,并且解码器,handler和excuterhandle,的引用也被回收。所以综上所述,推荐MemoryAwareThreadPoolExecutor,后者是没有必要的(具体的话 根据实际来处理),我是推荐前者!
这是ps old gen 所占的内存空间,使用MemoryAwareThreadPoolExecutor后;
这里是我在多次连接了服务端在3k,然后断了2k,变为了1k,被回收了的。