I checked the code and it works as it was designed. There is a WeakHashMap in _ComponentAttributesMap:
// Cache for component property descriptors
private static Map<Class<?>, Map<String, _PropertyDescriptorHolder>> propertyDescriptorCache =
new WeakHashMap<Class<?>, Map<String, _PropertyDescriptorHolder>>();
and _PropertyDescriptorHolder holds PropertyDescriptor and Method instances. It is not necessary to use WeakReference inside _PropertyDescriptorHolder, because the Classloader is already weakly reachable.
I took an application using tomcat 7.0.23 and then try to start/stop multiple times. If there is a memory leak, an OutOfMemoryException can be seen. It never happened.
What could happen is the classloader is not discarded by the gc immediately. But as soons as the jvm ask for memory and the gc do its cleanup job, it will found the classloader is weakly reachable and can be discarded from memory.
Unfortunately, the screenshot is not enough proof that a memory leak exist. We need to check if an OutOfMemoryException could be caused by this code.
Anyway, use a WeakReference is only reasonable if you can gain something, but I don't think it apply in this case.
Suggestions are welcome.