[ https://issues.apache.org/jira/browse/CXF-6642?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14959209#comment-14959209 ]
Chester Kim commented on CXF-6642: ---------------------------------- By using client.get(XXX.class), we have no visibility to the status code or any other properties of Response, right? > Memory Leak in ResponseImpl.readEntity() > ---------------------------------------- > > Key: CXF-6642 > URL: https://issues.apache.org/jira/browse/CXF-6642 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.1.2, 3.1.3 > Environment: Mac OS X 10.10.5, Spring 4.2.0 > Reporter: Chester Kim > Assignee: Sergey Beryozkin > Priority: Critical > Labels: client, cxf > Fix For: 3.0.7, 3.1.4 > > > Massive number of ResponseImpl instances are not garbage collected after > calling readEntity. By looking at VisualVM, it seems like those are > indirectly referred by something stored in ThreadLocal which is used by > context resolving and never been removed after all. Our production instance > actually caused OutOfMemory errors after this. It might be related to > https://issues.apache.org/jira/browse/CXF-6458 and looks simiar to > https://java.net/jira/browse/JERSEY-2463 but not sure. Note this only > happens when I used thread pool. > My workaround was bypassing readEntity() and deal with inputstream directly > like following which is not quite desirable but works for now. > {code} > private static Response copy(Response response) { > return Optional.ofNullable(response) > .map(r -> r.getEntity()) > .filter(e -> e instanceof InputStream) > .map(is -> newResponse(response.getStatus(), (InputStream)is)) > .orElse(response); > } > private static Response newResponse(int status, InputStream is) { > Response response = Response.serverError().build(); > try { > String payload = IOUtils.toString(is); > response = Response.status(status).entity(payload).build(); > } catch (IOException e) { > log.error("Failed to read entity from response", e); > } finally { > try { > is.close(); > } catch (IOException e) { > log.error("Failed to close InputStream after reading entity > from response", e); > } > } > return response; > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)