SpringMVC重定向導致的記憶體洩漏分析

2021-09-25 02:19:04 字數 3364 閱讀 8432

public string test(string redirecturl)

專案內乙個熱點介面,使用了如上**做**的重定向操作,而讓人沒想到的是:這樣子的寫法會有記憶體洩漏的風險

如果不處理,那麼隨著記憶體會耗盡。最終會導致頻繁的fullgc,而oom:gc overhead limit exceeded

圖為pinpoint監控下,執行多天後,最近一天的記憶體變化圖,最後記憶體降下來是因為修改後重啟了。

可以發現存在記憶體洩漏的情況,罪魁禍首是被concurrenthashmap(advisedbeans)引用的字串,檢視map的內容,發現如下,ref的key全部都是redirect開頭的字串,所以判斷問題出在springmvc的redirect上

但是僅僅知道問題出在這裡,還是不知道怎麼解決,所以下面是簡單的原始碼的乙個分析過程,只寫關鍵部分,可以按步驟自己對著原始碼看

首先將斷點定位到org.springframework.web.servlet.dispatcherservlet#doservice()=>dodispatch()下,至於為什麼?可能您需要了解一下springmvc的請求處理流程

在dodispatch()的最後,會呼叫org.springframework.web.servlet.dispatcherservlet#processdispatchresult()

org.springframework.web.servlet.dispatcherservlet#render(),從而呼叫#resolverviewname()進行viewname的解析

//....

if (mv != null && !mv.wascleared())

} //....

}

org.springframework.web.servlet.view.abstractcachin**iewresolver#resolverviewname(),在這裡會進行一次快取的判斷,生成乙個cachekey,cachekey是由viewname(redirect:redirecturl)+"_"+locale組成,存放到乙個名為viewaccesscache的concurrenthashmap中,需要注意的是,這個map有做容量的上限限制為1024,具體做法是在存放到map的同時,也會存放乙份到linkedhashmap中,通過#removeeldestentry去實現,所以如果redirecturl是固定的,那麼在第二次訪問的時候,會直接命中快取,也不會有記憶體洩漏的問題

}在這裡會將viewname作為key,value=boolean.false存入名advisedbeans的concurrenthashmap中,需要注意的是,這個map的無限的。

private final mapadvisedbeans = new concurrenthashmap(256);

protected object wrapifnecessary(object bean, string beanname, object cachekey) else if (boolean.false.equals(this.advisedbeans.get(cachekey))) else if (!this.isinfrastructureclass(bean.getclass()) && !this.shouldskip(bean.getclass(), beanname)) else

} else

}

spring mvc 請求重定向

1 我在後台乙個controller跳轉到另乙個controller 方式一 使用modelandview return new modelandview redirect tolist 這樣可以重定向到tolist這個方法 方式二 返回string return redirect tolist 其...

springmvc請求重定向

請求重定向的作用是將請求,重定向至另外乙個處理程式。它的特點是兩次請求,瀏覽器位址會改變,使用者可以感知 操作,可以使用modelandview物件 return newmodelandview redirect viewname modelmap 也可以直接返回字串檢視名 return redir...

nginx重定向導致埠對映的埠無法正常訪問

描述 在使用路由器進行埠對映的時候,如果使用和nginx 監聽的埠一樣是不存在問題的 但是如果使用了其他埠 就會出現無法訪問的問題。例如 訪問 會直接跳轉到 通過web端的開發者工具 可以看到進行了一次301重定向 並且我們可以看到location跳轉到了nginx 監聽的埠 後來我去檢視對應loc...