刚进一个项目组, 不熟悉代码, 产品跑个三四天就报内存不够, 肯定是 code 里面有问题, 怎么找到问题的所在?

-- 找 static 的東西,特別是 static 的 Collection。

-- 是不是因为 GC 忽略 static 的内容?

   -- 這個是肯定的,程序員很容易就犯錯誤,比較常見的就是 singleton 的 manager 問題,有些 static 的 Collection,往裏麵 put 了,卻沒有 remove,還是 static 的……

   -- 不是 gc 忽略 static 的内容。因为 static 的 collection 的生命周期和程序的运行周期一样长,如果在 static 的 collection 中有其他对象的引用,那么 gc 就永远不会收集里面的内容,即使在其他地方也没有用到了。很经典的内存泄漏就是在 Stack 的设计中,弹出一个 element 的时候,没有把其中的引用置为 NULL。在缓存设计中也会有这个问题,解决类似问题的一个办法是采用弱引用。

-- 找那些 singleton 會找出點東西

-- 一般的 Java 里面内存泄露都与 Collection 有关,常见的可能是 map 里面放了太多的东西,不用的时候又没有 remove 掉;所以 Java 里面有 WeakHashMap 这个类以及相关的一些类、接口