java的Mmap二三事
来源:互联网
其实在日常工作中,很多时候最麻烦的问题是要把数据存在哪里和如何对这些数据进行存取和管理。保存数据也无外乎数据库、文件和内存这几种方式,我这里涉及到的情况是用户登陆时把很多数据(比如好友列表、在线信息等)从各个地方拉过来丢到内存里,当用户logout之后再把这些东西清理出去,其实就是一个临时的cache。目前的做法是弄几个HashMap,再起几个清理线程每隔一段时间遍历一遍把map里过期数据清理出去。看起来貌似没啥问题,事实上之前跑了很长时间也没出任何问题。但倒霉的是我接手不久之后,随着用户数量的增长,出现高峰期java进程占用内存数量越来越高、直到把所有内存都吃干净然后挂掉的现象。但是我用jprofiler等工具经过仔细分析验证之后发现即便是达到目前设计容量的上限,内存也还会有很大富余,那问题就出在JVM没有很好地进行内存回收。虽然升级JDK解决了问题,但是引发了我其他的一些思考。(1)对于内存管理引发的问题,如果jvm没帮我们搞定怎么办?虽然sun的更新还算快,我们也许不会每次都如此幸运(2)java对象占用的内存中远比我们通过看到的东西计算出来的要大很多,例如一个含有800万个key/value对的HashMap,其key和value都是int(注意不是Integer),在内存中大概就要340M。所以有些结构化数据,例如每个用户的年龄、性别、生日等信息(按ID进行索引)似乎用共享内存的方法开辟出一块缓冲区来管理更合适。(3)同样是这些信息,虽然只是临时的cache,但是我希望Server重启之后这些信息不要丢失,因为重新load需要不少时间和代价。 其实在日常工作中,很多时候最麻烦的问题是要把数据存在哪里和如何对这些数据进行存取和管理。保存