--- a/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java Thu Aug 29 18:58:18 2013 -0700
+++ b/jdk/src/share/classes/javax/management/remote/rmi/RMIConnector.java Fri Aug 30 12:49:41 2013 +0200
@@ -405,14 +405,7 @@
throw new IOException("Not connected");
}
- MBeanServerConnection rmbsc = rmbscMap.get(delegationSubject);
- if (rmbsc != null) {
- return rmbsc;
- }
-
- rmbsc = new RemoteMBeanServerConnection(delegationSubject);
- rmbscMap.put(delegationSubject, rmbsc);
- return rmbsc;
+ return getConnectionWithSubject(delegationSubject);
}
public void
@@ -1831,7 +1824,7 @@
// Initialization of transient variables.
private void initTransients() {
- rmbscMap = new WeakHashMap<Subject, MBeanServerConnection>();
+ rmbscMap = new WeakHashMap<Subject, WeakReference<MBeanServerConnection>>();
connected = false;
terminated = false;
@@ -2011,6 +2004,25 @@
private final ClassLoader loader;
}
+ private MBeanServerConnection getConnectionWithSubject(Subject delegationSubject) {
+ MBeanServerConnection conn = null;
+
+ if (delegationSubject == null) {
+ if (nullSubjectConnRef == null
+ || (conn = nullSubjectConnRef.get()) == null) {
+ conn = new RemoteMBeanServerConnection(null);
+ nullSubjectConnRef = new WeakReference(conn);
+ }
+ } else {
+ WeakReference<MBeanServerConnection> wr = rmbscMap.get(delegationSubject);
+ if (wr == null || (conn = wr.get()) == null) {
+ conn = new RemoteMBeanServerConnection(delegationSubject);
+ rmbscMap.put(delegationSubject, new WeakReference(conn));
+ }
+ }
+ return conn;
+ }
+
/*
The following section of code avoids a class loading problem
with RMI. The problem is that an RMI stub, when deserializing
@@ -2551,7 +2563,8 @@
private transient long clientNotifSeqNo = 0;
- private transient WeakHashMap<Subject, MBeanServerConnection> rmbscMap;
+ private transient WeakHashMap<Subject, WeakReference<MBeanServerConnection>> rmbscMap;
+ private transient WeakReference<MBeanServerConnection> nullSubjectConnRef = null;
private transient RMINotifClient rmiNotifClient;
// = new RMINotifClient(new Integer(0));