以前没有实际的backend开发经验,这两天后台刚上线,由于之前没有做过压力测试,上线后发现内存会在半天或一天内慢慢耗尽。开始怀疑ehcache设置的比较大,服务器只分配了5G内存,所以调低了ehcache的缓存数。
例如从
<cache name="com.telenavsoftware.doudouy.entity.User" maxElementsInMemory="100000 " maxElementsOnDisk="0" eternal="false" overflowToDisk="true" diskPersistent="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LFU" />
改为
<cache name="com.telenavsoftware.doudouy.entity.User" maxElementsInMemory="10000" maxElementsOnDisk="0" eternal="false" overflowToDisk="true" diskPersistent="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LFU" />
不行还是耗尽。
增大服务器内存到8G
还是耗尽
开始用jconsole监控内存
http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
用jmap 到处heap
./jmap -histo -F pid
都不是很方便
搜索内存泄漏的解决方法,发现很多人都使用Jprofiler来定位问题。从官网上下载Jprofiler最新版6.2.2
网上的一些配置方法都是针对之前的版本,有些已经不适用了。6.2.2的使用更简单。
服务器上安装jprofiler_linux_6_2_2.sh 直接运行
注意要有运行权限,要有java的环境。
ldd libjprofiler.so 查看文件依赖关系
将 -agentpath:/opt/jprofiler6/bin/linux-x64/libjprofilerti.so=port=8849 配到java的启动参数里
安装windows上的jprofiler配置简单
参考网上教程即可
jms 如果使用<amq:kahaPersistenceAdapter directory="${application.jms.directory}/database"> 持久化
lucence 使用<entry key="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
都会是server打开过多文件 改为
<amq:jdbcPersistenceAdapter dataSource="#dataSource" />
<entry key="hibernate.search.default.directory_provider" value="ram" />
这样server 使用内存稳定多了