首先咱們來作一個實驗,建立一個web項目,放到tomcat下,而後對這個項目的index.jsp使用JMeter進行壓測:<br>html
首先設置tomcat當發生OOM時保存堆棧的信息, 修改catalina.bat文件,添加java
set JAVA_OPTS=%JAVA_OPTS% -Xms64m -Xmx64m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\dumpinfo\
設置tomcat啓動時堆內存的初始化和最大內存大小都是64M(方便測試),-XX:+HeapDumpOnOutOfMemoryError表示當發生內存溢出時自動生成dump文件, -XX:HeapDumpPath=F:\dumpinfo\設置dump文件保存的路徑web
index.jsptomcat
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首頁</title> </head> <body> Hello This is index.jsp </body> </html>
啓動Tomcat,咱們先來看一下沒有用戶請求時tomcat的堆內存的信息,經過JVisualVM工具來看一下:服務器
在沒有請求的時候tomcat的內存使用率還不到一半,下面經過JMeter來進行壓測:session
首先使用200個線程來模擬200個用戶對tomcat進行請求:併發
當執行到到84771個請求時發生了OOM,咱們來分析一下dump文件,看一下哪些對象佔用的內存太多(使用MAT來分析) jsp
經過MAT來看,session所佔的內存達到了29M之多,快佔用了一半的內存,,session果真是一個重量級的對象。工具
下面咱們在tomcat中禁用session,再進行壓測看一下內存使用狀況。 測試
執行到210000次請求的時候也沒有發生內存溢出的問題,所以,剛剛發生的OOM問題就是session致使的,在請求和併發比較大的web項目中,咱們能夠經過自定義session實現來減輕服務器由於建立過多的session而致使OOM的問題。