//摘自 …/Concepts.doc.html#32202
A class or interface may be unloaded if and only if its class loader is unreachable. The bootstrap class loader is always reachable; as a result, system classes may never be unloaded.
//摘自JLS 12.7 Unloading of Classes and Interfaces
1. An implementation of the Java programming language may unload classes.
2. Class unloading is an optimization that helps reduce memory use. Obviously,
the semantics of a program should not depend on whether and how a system
chooses to implement an optimization such as class unloading.
3. Consequently, whether a class or interface has been unloaded or not should be transparent to a program.
1. A reachable object is any object that can be accessed in any potential continuing
computation from any live thread.
2. finalizer-reachable : A finalizer-reachable object can be reached from some finalizable object through some chain of references, but not from any live thread. An unreachable object cannot be reached by either means.
Exception in thread "main" java.lang.LinkageError: duplicate class definition: MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at MyURLClassLoader.loadClass(MyURLClassLoader.java:51)
at Main.main(Main.java:27)
结论:如果同一个类加载器实例重复强制加载(含有定义类型defineClass动作)相同类型,会引起java.lang.LinkageError: duplicate class definition.