Author: limpbizkit
Date: Thu Jan 1 21:43:40 2009
New Revision: 791
Added:
wiki/ClassLoading.wiki
Log:
Created wiki page through web user interface.
Added: wiki/ClassLoading.wiki
==============================================================================
--- (empty file)
+++ wiki/ClassLoading.wiki Thu Jan 1 21:43:40 2009
@@ -0,0 +1,32 @@
+#summary Motivation for and consequences of generating classes in Guice
+=Class Loading=
+Guice performs code generation and class loading. We use this stuff for
faster reflection, method interceptors, and to proxy circular dependencies.
+
+When loading classes, we need to be careful of:
+ * *Memory leaks.* Generated classes need to be garbage collected in
long-lived applications. Once an injector and any instances it created can
be garbage collected, the corresponding generated classes should be
collectable.
+ * *Visibility.* Containers like `OSGi` use class loader boundaries to
enforce modularity at runtime.
+
+For each generated class, there's multiple class loaders involved:
+ * *The target class's class loader.* Every generated class services
exactly one user-supplied class. This class loader must be used to access
members with private and package visibility.
+ * *Guice's class loader.*
+ * *Our bridge class loader.* This is a child of the target class's
loader. It selectively delegates to either the target class's loader (for
user classes) or the Guice class loader (for internal classes that are used
by the generated classes). This class loader that owns the classes
generated by Guice.
+
+
+==The Bridge !ClassLoader==
+Guice uses its bridge class loader unless:
+ * A package-private method is being intercepted
+ * A method in a package-private class is being intercepted
+ * The target class was loaded by the system class loader
+ * It is disabled
+
+Only classes loaded by the bridge class loader will work in an OSGi
environment.
+
+
+==Disabling Guice's Bridge !ClassLoader=
+Setting the system property `guice.custom.loader` to `false` will cause
Guice to use the target class's classloader for all generated classes.
Guice's bridge classloader will not be used.
+
+
+==Generated Classes and Memory Leaks==
+Classes can only be garbage collected when all of their instances and the
originating classloader are no longer referenced. The bridge class loader
is intended to allow generated classes to be garbage collected as quickly
as possible.
+
+To minimize the amount of !PermGen memory used by Guice-generated classes,
avoid intercepting package-private methods.
\ No newline at end of file
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"google-guice-dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-guice-dev?hl=en
-~----------~----~----~----~------~----~------~--~---