昨天下午,生产环境168服务器突然报内存溢出.临时抓了jvm快照.重启解决.
今天分析jvm快照.一眼就发现有对象貌似存在异常.DictSegment对象在JVM中有60W+个实例化的对象.
凭经验,一般的JVM溢出都是有对象没有处理好.GC没有回收,导致在JVM里越来越多导致.所以首先排查调用这个类的方法.
检查代码,发现只有一个类IndexCreateUtil使用到了DictSegment.方法本身的实现上没有问题.网上的demo方法都是这样使用的.
实践出真知.自己写个测试类.
public class TestIndexCreateUtil2 {
}
|
再次问度娘,调用方法都是对的,大概看了一下,感觉跟IKAnalyzer本身的分词算法可能有关.
换一个思路.使用IKAnalyzer的作用就是加一些tag.没有使用其他比较高深的东西.那换一个分词软件行不行?
找到度娘比较推荐的ansj测试.功能可以实现.也没有产生几十万个相同的类对象.再看内存使用.悲剧了.一句分词,内存直接从10M不到飙升到接近100M.而IKAnalyzer内存变动在10M以内的.
综合考虑.还是不换IKAnalyzer了.在此标记一下.抓取到的JVM快照中如果有60W+个DictSegment对象.是正常的(但确实有点奇葩:).
JVM溢出的原因待继续查找.