我在試圖追蹤這個OutOfMemoryError時遇到了很糟糕的情況,我非常感謝您的幫助。我的應用程序被分成了體系結構部分和一個模塊,這些模塊公開了一些基本的REST WS和由Hibernate製作的數據庫CRUD操作。主體系結構具有記錄和管理屬性和配置的唯一角色(所有這些都由Spring處理)。追蹤OutOfMemoryError
應用程序沒有做任何事情,但仍然在2-3熱重新部署與Tomcat 7後我得到一個OutOfMemoryError。我做了一個堆轉儲與VisualVM的打開了它,這是我所看到的:
正如你所看到的,我有很多串,的char []和byte []左右。真正操縱這種數據的唯一類是它是一個Servlet過濾器只有這樣的記錄:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
Map<String, String> requestMap = this
.getTypesafeRequestMap(httpServletRequest);
BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(
httpServletRequest);
BufferedResponseWrapper bufferedResponse = new BufferedResponseWrapper(
httpServletResponse);
final StringBuilder logMessage = new StringBuilder(
"REST Request - ").append("[HTTP METHOD:")
.append(httpServletRequest.getMethod())
.append("] [PATH INFO:")
.append(httpServletRequest.getRequestURI())
.append("] [REQUEST PARAMETERS:").append(requestMap)
.append("] [REQUEST BODY:")
.append(bufferedRequest.getRequestBody())
.append("] [REMOTE ADDRESS:")
.append(httpServletRequest.getRemoteAddr()).append("]");
long startTime = System.currentTimeMillis();
chain.doFilter(bufferedRequest, bufferedResponse);
long elapsed = System.currentTimeMillis() - startTime;
logMessage.append(" [RESPONSE:")
.append(bufferedResponse.getContent())
.append("] [ELAPSED TIME:").append(elapsed).append("ms]");
log.debug(logMessage.toString());
}
當記錄器是不是這個原因,可能是由於某些春/休眠/ Tomcat的/我不知道的一些圖書館?
如果您需要其他任何東西,比如Spring配置,請隨時詢問。
謝謝!
什麼是你的tomcat內存設置(Xmx,PermSize)? –
當Tomcat作爲應用程序服務器啓動時,是否嘗試爲Web應用程序分配更多內存?還試圖找出是否「一個支配者對象」創建並持有許多引用(我在Hibernate是原因時遇到過一個案例) – dumitru