被gc和weakref打败了。 这两天在折腾一个数据缓存的rpc服务,简单说就是个内存缓存,计划不打算用redis,memcached。 因为毕竟这些nosql是跨进程的,链接又是tcp链接,肯定是有损耗的。
但是,我想的太简单了。 再实现的过程中,发现内存总是释放不了,调用gc释放也是相当的有限,这让人十分的抓狂。一开始是以为自己程序的问题,但是随着一遍遍的看代码,发现不对劲,程序里面的那个hash已经基本清零了,但是占用内存还是不少。紧接着我换了套策略,改用lru,lfu的方式,最少使用算法和计数使用算法,看起来很时尚,永远会把旧的数据踢出去,但是…… 踢不干净咋整? lru 还真踢不干净…..
后来搜了下文档,说是用weakref这样的弱引用可以解决。。。 但是,效果也是不明显。 说实话,十分的郁闷呀。
这里针对我的程序,我简单写个demo,体现下我的问题。 有兴趣的朋友也可以看看。
大家会发现,他的内存在gc收回和weakref消除后,还是不能缩减到他一开始的内存使用数。 我这边如果做缓存的话,占用内存大小估计在10G左右,但是如果总是消减不清楚,然后慢慢的,内存中垃圾数据了。
# xiaorui.cc class TestObj: def __init__(self): self.test_attr = 100 self.woyao = {} def pp(self,go): print go print self.woyao def set(self,key): self.woyao[key] = '11sdlfjljlskjdf lsdjkflsjdflksdjflsjdf;skf;aksdjflksdjfmnsndf soduifoiuwflkjsldkjflksjdflksjdflksjdfkasdfjlskdjflskdjfoiuweorisdnflksndflnsldkjlsndfls ndcljksdlfjsdlfkjsdlfkjsd;flkjsdflkjsdf;sdfljsdfoiuwlksdjflkj' def test_func(reference): print 'Hello from Callback function!' a = TestObj() #建立一个对a的代理(弱引用) x = weakref.proxy(a, test_func) for i in xrange(10000000): x.set(i) del a del x gc.collect() print 'del..' time.sleep(15)
后来怎么解决的? 专家
后来确定别的逻辑都回收,就mysql 在多线程复用得时候没回收,换了pymysql
lru,lfu 这个是啥,看不懂