JAVA_OPTS="$JAVA_OPTS -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/heapdump002"
在凯特琳娜.sh文件中,加入此配置。
在内存溢出时会把服务器当前信息打印到该文件中。
但有一点,此文件会很大,内存上限4G 那么 该文件有有4G。
2017年4月12日10:40:13
接上文,在经过了一段时间正式应用后,昨天终于内存溢出了 。
从服务器上下载了 记录内存情况的文件。但是不知道如何分析。
经组内经验充足的前辈指导,指导了有一个eclipse插件。能够专门用来分析内存使用情况。插件名称为:MemoryAnalyzer 一个界面类似eclipse的软件。
可以打开服务器上记录内存信息的二进制文件 ,格式为:.hprof格式
从百度上即可下载。
下载后,直接打开 .exe文件,fileopen内存信息文件。 界面中含有饼状图用来展示内存使用情况。
使用插件后分析 有一个大块儿的饼状图,占用内存 90%+ 找到该模块,进行分析后发现,原来是 mysql 相关的 insert语句出现问题。
个人分析可能是因为是积月累的insert语句连接数据库后不能及时释放。所以导致内存溢出。
排查指定sql语句及与数据库mysql连接层并未发现未释放连接等其他肉眼可见现象。
后百度未果,询问组内经验人士得知,问题出现在 使用的mysql6.0.jar包上。 这个jar包不知道是之前哪位项目开发人员引入(可能是非官方版本)。此jar包中,在insert量大的时候,会出现不稳定情况。导致insert占用内存。
后更换为mysql5.1.2.jar包,部署测试环境,进行压测,300*300再未发现insert占用大量内存,饼状图上的模块也都是正常占用10%+,没有特别明显的占用模块。
问题解决。,,,,
下面是一个手动从linux上获取内存状况文件 输出到文件。
jmap -dump:format=b,file=temp_heapdump.hprof <pid> 手动打印内存使用情况
<pid> 用来替换 pid
mysql-connector-java-5.1.27
这个insert的问题得到修复的版本。公司的其他项目用的也是此jar包。