Spring整合Shiro時記憶體溢位的問題分析

2021-07-12 04:10:49 字數 1706 閱讀 3955

前段時間有一天系統訪問量突然增加,系統每隔一兩個小時就會由於記憶體瞬時飆公升而宕機。檢視記憶體dump檔案發現其中shiro的******session物件異常多

。後來經分析才發現是由於使用spring整合shiro時配置不當導致的。當時的配置如下:

"sessionmanager"

class="org.apache.shiro.session.mgt.defaultsessionmanager">  

"globalsessiontimeout" value="3600000"/>  

"deleteinvalidsessions" value="true"/>  

"sessionvalidationschedulerenabled" value="true"/>  

"sessiondao" ref="sessiondao"/>  

該配置中使用shiro自帶的使用者會話超時校驗功能,每乙個小時執行一次該邏輯。 

經過研究源**發現有需要進行認證授權等驗證的請求進入的時候,defaultsessionmanager物件(即上面配置的"sessionmanager"bean)會判斷其中的sessionvalidationscheduler屬性物件是否存在(該物件負責執行會話超時校驗邏輯)。如果不存在,會建立乙個該物件,並通過scheduledexecutorservice建立守護執行緒定時執行。

但是該建立過程沒有做併發控制,當請求併發大的時候,會建立很多個s

essionvalidationscheduler物件。雖然defaultsessionmanager物件中只保留了乙個引用,但是scheduledexecutorservice建立守護執行緒中還維持了這些多餘的s

essionvalidationscheduler物件。這樣當執行週期到的時候,會有很多個執行緒一起將會話物件載入到記憶體,從而導致記憶體瞬時飆公升。

解決方法很簡單:將

executorservicesessionvalidationscheduler配置成bean,並注入到"sessionmanager"bean中。這樣就不會生成重複的sessionvalidationscheduler物件。

"sessionmanager"

class="org.apache.shiro.session.mgt.defaultsessionmanager">  

"globalsessiontimeout" value="3600000"/>  

"deleteinvalidsessions" value="true"/>  

"sessionvalidationschedulerenabled" value="true"/>  

"sessionvalidationscheduler"

ref=

"sessionvalidationscheduler"

/>  

"sessiondao" ref="sessiondao"/>  

"sessionvalidationscheduler"

class

="org.apache.shiro.session.mgt.executorservicesessionvalidationscheduler"

>

"interval"

value=

"3600000"

/>

"sessionmanager"

ref=

"sessionmanager"

/>

shiro與spring的整合

1.除了spring本身專案的jar包,還要加入四個jar包 1 shiro all 1.2.5.jar 2 slf4j api 1.7.7.jar 3 slf4j log4j12 1.7.7.jar 4 log4j 1.2.17.jar 2.首先進行web.xml的配置 參考官方的文件 需要在we...

shiro學習筆記(5) spring整合

spring整合shiro 1 1 jar org.apache.shiro shiro spring 1.2.3 2 web.xml contextconfiglocation classpath spring shiro.xml org.springframework.web.context.c...

整合struts和spring時

連線點 struts2的action由spring產生 大致如下 首先加入各自所需的jar包,連線時要加入struts2 spring plugin x.x.x.jar 1.修改web.xml加入struts的filter struts2 org.apache.struts2.dispatcher....