myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leonardo Uribe (JIRA)" <...@myfaces.apache.org>
Subject [jira] Commented: (MYFACES-1796) FactoryFinder.releaseFactories() does not release application class loader. (PATCH available).
Date Thu, 03 Apr 2008 20:07:24 GMT

    [ https://issues.apache.org/jira/browse/MYFACES-1796?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12585268#action_12585268
] 

Leonardo Uribe commented on MYFACES-1796:
-----------------------------------------

Yes, the problem presented is clear. But I think that it is better to synchronize some parts
of the code instead use synchronized HashMaps. The access to  _registeredFactoryNames on getFactory
must be synchronized to avoid effects. And the value retrieved through classLoader (a Map)
must be cleaned for allow gc recolect memory.

I will do more tests about this and commit a modifications of the proposal

> FactoryFinder.releaseFactories() does not release application class loader. (PATCH available).
> ----------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-1796
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1796
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-127
>    Affects Versions: 1.1.5,  1.2.0
>            Reporter: Konstantin Triger
>            Assignee: Leonardo Uribe
>
> FactoryFinder._registeredFactoryNames holds the Web application class loader as a key
and thus prevents its collection when the application is undeployed.
> The following patch fixes the issue (made in 1.1.5 branch):
> Index: FactoryFinder.java
> ===================================================================
> --- FactoryFinder.java  (revision 608034)
> +++ FactoryFinder.java  (working copy)
> @@ -40,7 +40,7 @@
>      public static final String LIFECYCLE_FACTORY = "javax.faces.lifecycle.LifecycleFactory";
>      public static final String RENDER_KIT_FACTORY = "javax.faces.render.RenderKitFactory";
> -    private static Map _registeredFactoryNames = new HashMap();
> +    private static Map _registeredFactoryNames = Collections.synchronizedMap(new HashMap());
>      /**
>       * Maps from classLoader to another map, the container (i.e. Tomcat) will create
a class loader for
>       * each web app that it controls (typically anyway) and that class loader is used
as the key.
> @@ -49,7 +49,7 @@
>       * that are created via getFactory. The instances will be of the class specified
in the setFactory method
>       * for the factory name, i.e. FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY,
MyFactory.class).
>       */
> -    private static Map _factories = new HashMap();
> +    private static Map _factories = Collections.synchronizedMap(new HashMap());
>      private static final Set VALID_FACTORY_NAMES = new HashSet();
>      private static final Map ABSTRACT_FACTORY_CLASSES = new HashMap();
> @@ -222,6 +222,7 @@
>      {
>          ClassLoader classLoader = getClassLoader();
>          _factories.remove(classLoader);
> +        _registeredFactoryNames.remove(classLoader);
>      }
>      private static void checkFactoryName(String factoryName)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message