我在试图追踪这个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