[ 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