[ 
https://issues.apache.org/jira/browse/CXF-2939?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13017393#comment-13017393
 ] 

Sergey Beryozkin commented on CXF-2939:
---------------------------------------

JAXBProviders are endpoint scoped in 2.4.0 - so no WAR 'specific' JAXB contexts 
will be stored at the shared loader level

> Permgen Leak in JAXB due to recreation of JAXBContexts in CXF
> -------------------------------------------------------------
>
>                 Key: CXF-2939
>                 URL: https://issues.apache.org/jira/browse/CXF-2939
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 2.1.5
>            Reporter: Stefan Schubert
>            Assignee: Daniel Kulp
>             Fix For: 2.2.10
>
>         Attachments: removed_weak_hash_maps.patch
>
>
> From 
> http://cxf.547215.n5.nabble.com/REST-web-service-loading-many-classes-for-each-request-CXF-2-2-6-and-jaxb-impl-2-1-5-td2266472.html#a2266472:
> If a GC occurs, WeakRefs throw away the JAXBContext. So on the next occasion 
> (where occasion could be one of billions of calls to a CXF/JAXB api) the 
> JAXBContext has to be rebuilt from scratch. 
> JAXB (specifically com.sun.xml.bind.v2.runtime.reflect.opt.AccessorInjector) 
> calls com.sun.xml.bind.v2.runtime.reflect.opt.Injector#find to try, if it 
> already created a field or method accessor class. If not it injects a new one 
> into the class loader via 
> com.sun.xml.bind.v2.runtime.reflect.opt.Injector#inject. 
> The problem is now that #inject caches the generated accessor in the Injector 
> and find only looks into the Injector (and never again into the class loader, 
> where it used to define the class). But once a GC occurs the Injector throws 
> itself away, too (caching itself in some weak map). 
> So it happens that each REST api call after a GC occurred a hundred new 
> classes are created by JAXB - because JAXB on low-level forgets the classes 
> it defines (and keeps them on high-level) and CXF forgets the JAXBContext so 
> that the high-level memory of JAXB is erased as well. 
> There are four possible solutions: 
>  - Fix the Injector: Actually very easy and my favorite solution. Just let 
> the Injector look into the class loader as well when it cannot find the class 
> in its own memory. BUT to have a bug fixed in JAXB actually sounds scary, how 
> long would that take to get into a version?) 
>  - Enable CXF to keep only one JAXB context (and not to throw it away) - do 
> not know how to do that 
>  - Use a workaround to disable bytecode generation by JAXB 
> (-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true) --> disables the 
> whole bytecode magic Injector stuff and just does reflection - probably with 
> a slight performance impact 
>  - Do not use JAXB with CXF on a website with significant load 

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to