使用jprofile 分析线上大对象问题记录
昨天在线上使用arthas观察服务器使用情况,使用dashboard命令后发现cpu飚到了80%,按说我们这点量 cpu 这么高太不正常了。让同事借助arthas命令 heapdump /tmp/dump.hprof 给我dump文件,然后使用jprofile 分析。
先上图
点击最大对象,发现占用最大的是org.springframework.boot.loader.LaunchedURLClassLoader 类加载器。继续右键,使用选定对象,发现java.util.Vector占用了很大的内存。继续使用选定对象,确定,嗯 发现问题了:net.sourceForce.pinyin4j.CHineseToPinyinResource 这个类占用了很大的内存。235M .这个占用了将近30M.看了下项目里面使用,就是在显示昵称后要显示相应的拼音首字母。网上搜索了下,发现这个确实很耗内存。看了下源码,里面有一个Trie的类,会递归调用。如果递归的太深,确实是很耗内存的。好吧。
看看有没有代替的。去github上搜索了下,TinyPinyin ,github地址:https://github.com/promeG/TinyPinyin 。效率是pin4j的4-16倍。而且也做了一些优化。在简单看了下用法,嗯 挺简单的。本地写了一个demo。但是 ,发现 ,怎么没有pom的依赖方式。。。 这么好的项目。
还好,去issue里面搜了下,还有不少人遇到这个问题。有人已经封装好了:https://github.com/hellokaton/TinyPinyin
引入maven依赖:
<dependency>
<groupId>io.github.biezhi</groupId> <artifactId>TinyPinyin</artifactId> <version>2.0.3.RELEASE</version> </dependency>
写好测试用例,看了下注意事项。嗯,基本能满足我们的业务需求。就这样吧。