The caches in ObjectStreamClass basically map WeakReference<Class> to 
SoftReference<ObjectStreamClass>, where the ObjectStreamClass also references 
the same Class. That means that the cache entry, and thus the class and its 
class-loader, will not get reclaimed, unless the GC determines that memory 
pressure is very high.

However, this seems bogus, because that unnecessarily keeps ClassLoaders and 
all its classes alive much longer than necessary: as soon as a ClassLoader (and 
all its classes) become unreachable, there is no point in retaining the stuff 
in OSC's caches.

The proposed change is to use WeakReference instead of SoftReference for the 
values in caches.

Testing:
 - [x] tier1
 - [x] tier2
 - [ ] tier3
 - [ ] tier4

-------------

Commit messages:
 - Fix indentation of new testcase
 - 8277072: ObjectStreamClass caches keep ClassLoaders alive

Changes: https://git.openjdk.java.net/jdk/pull/6375/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=6375&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8277072
  Stats: 112 lines in 2 files changed: 107 ins; 1 del; 4 mod
  Patch: https://git.openjdk.java.net/jdk/pull/6375.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/6375/head:pull/6375

PR: https://git.openjdk.java.net/jdk/pull/6375

Reply via email to