LoadRunner疲劳压测导致内存溢出问题解决
1、使用jconsole进行监控JVM内存使用情况,发现可以正常释放堆内存
2、配出项目复杂业务逻辑影响,直接访问index.jsp页面
当并发为2时,TPS:120 内存正常释放
当并发为4时,TPS:200 内存释放慢,导致内存溢出
从而使TPS一直下降,说明有内存未来得及释放,导致内存溢出
3、监控内存溢出数据
export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError"
在weblogic启动参数中添加“-XX:+HeapDumpOnOutOfMemoryErro”令系统出现内存溢出时,生成heapdump文件,以便分析引发内存溢出的原因
一、 系统环境参数
Weblogic |
<?xml version="1.0" encoding="UTF-8"?>
|
Linux |
Linux version 2.6.32-431.el6.x86_64 (mockbuild@x86-023.build.eng.bos.redhat.com) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Sun Nov 10 22:19:54 EST 2013 |
JDK |
java version "1.6.0_37" |
2、初始参数
启动admin与online
Admin |
weblogic 50455 50366 9 16:01 pts/2 00:00:47 /home/mw/weblogic/jrockit1.6/bin/java -jrockit -Xms1024m -Xmx1024m -Dweblogic.Name=AdminServer -Djava.security.policy=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -da -Dplatform.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3 -Dwls.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server -Dweblogic.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server -Dweblogic.management.discover=true -Dwlw.iterativeDev=false -Dwlw.testConsole=false -Dwlw.logErrorsToConsole=false -Dweblogic.ext.dirs=/home/mw/weblogic/Oracle/Middleware/patch_wls1036/profiles/default/sysext_manifest_classpath weblogic.Server
|
Online |
weblogic 50630 50541 99 16:02 pts/2 00:20:50 /home/mw/weblogic/jrockit1.6/bin/java -jrockit -Xms1024m -Xmx1024m -Dweblogic.Name=online -Djava.security.policy=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -Dweblogic.security.SSL.trustedCAKeyStore=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/cacerts -Dweblogic.threadpool.MinPoolSize=1500 -Dweblogic.threadpool.MaxPoolSize=1500 -Xmanagement -Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -XX:+HeapDumpOnOutOfMemoryError -da -Dplatform.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3 -Dwls.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server -Dweblogic.home=/home/mw/weblogic/Oracle/Middleware/wlserver_10.3/server -Dweblogic.management.discover=false -Dweblogic.management.server=t3://alipayap:7001 -Dwlw.iterativeDev=false -Dwlw.testConsole=false -Dwlw.logErrorsToConsole=false -Dweblogic.ext.dirs=/home/mw/weblogic/Oracle/Middleware/patch_wls1036/profiles/default/sysext_manifest_classpath weblogic.Server
|
Admin |
Total mapped 7421180KB (reserved=5845412KB) - Java heap 1048576KB (reserved=0KB) - GC tables 35084KB - Thread stacks 30372KB (#threads=75) - Compiled code 1048576KB (used=15521KB) - Internal 1416KB - OS 141524KB - Other 4976368KB - Classblocks 7936KB (malloced=7749KB #20800) - Java class data 130304KB (malloced=130080KB #94534 in 20800 classes) - Native memory tracking 1024KB (malloced=161KB #10)
|
Online |
Total mapped 36434172KB (reserved=34360944KB) - Java heap 1048576KB (reserved=0KB) - GC tables 35084KB - Thread stacks 441364KB (#threads=0) - Compiled code 1048576KB (used=0KB) - Internal 1672KB - OS 141520KB - Other 33565572KB - Classblocks 8448KB (malloced=8175KB #22724) - Java class data 140800KB (malloced=139949KB #103882 in 22724 classes) - Native memory tracking 2560KB (malloced=1371KB #10)
|
3、Online溢出后信息
Admin |
Total mapped 7486988KB (reserved=5910828KB) - Java heap 1048576KB (reserved=0KB) - GC tables 35084KB - Thread stacks 30644KB (#threads=76) - Compiled code 1048576KB (used=15545KB) - Internal 1416KB - OS 141656KB - Other 5041772KB - Classblocks 7936KB (malloced=7752KB #20811) - Java class data 130304KB (malloced=130113KB #94587 in 20811 classes) - Native memory tracking 1024KB (malloced=162KB #10)
|
Online |
Total mapped 36435708KB (reserved=34331208KB) - Java heap 1048576KB (reserved=0KB) - GC tables 35084KB - Thread stacks 431300KB (#threads=1549) - Compiled code 1048576KB (used=14733KB) - Internal 1672KB - OS 141792KB - Other 33575364KB - Classblocks 8448KB (malloced=8174KB #22721) - Java class data 140800KB (malloced=139904KB #103863 in 22721 classes) - Native memory tracking 4096KB (malloced=1371KB #10)
|
4、分析内存溢出文件
支付宝压力测试故障处理报告
1、 概述
2016年3月30日,功能压力测试时发现当压力机达到200tps时,被管服务器online堆内存持续上涨,并最终出现内存溢出问题,通过分析日志、监控online堆内存增涨曲线初步定位online出现内存泄露问题。
2、 分析
通过分析日志发现系统出现“OutOfMemoryError”即堆内存溢出问题,即在weblogic启动参数中添加“-XX:+HeapDumpOnOutOfMemoryErro”令系统出现内存溢出时,生成heapdump文件,以便分析引发内存溢出的原因。
再次压力测试发现系统抛出“OutOfMemoryError”异常,并生成对应的heapdump,使用工具分析heapdump发现server中存在一个【MemorySessionContext】对象占用了【1,145,301,736】字节的数据,通过分析此对象为weblogic的memorySession对象,分析截图如下:
由此分析引发内存溢出的原因可能如下:
I、 由于没有设置session超时,导致所有的会话信息在堆内存保存,导致内存溢出;
II、 由于设置的session超时时间较长,在大并发的情况下,未等到session失效便积累了大量会话,使会话信息占用大量堆内存,导致内存溢出。
3、 处理建议
I、 请检查应用程序是否设置了session超时;
II、 请根据应用程序的情况,适当调整session超时的时间;
III、 有针对性的调整压力测试策略,使压力测试符合真实使用场景;
IV、 若设置了session超时、并且超时时间已最优,实用场景也没有问题,请适当扩大堆内存,令堆内存设置为大于原来的4G。(注意:不建议这样做,堆内存越大每次Full GC的时间便会加长)