Yes we would need to iterate through the map while putting/getting the ServiceSchemaInfo. Do you think we should instead choose to retain the schemaCacheMap, but make the value always a weak object. (Putting a WeakReference of the ServiceSchemaInfo in the map). This way also we can solve the current problem. What do you say?
On Sun, Jun 1, 2008 at 7:19 AM, Daniel Kulp <[EMAIL PROTECTED]> wrote: > > Hmmm.... good sleuthing. > > You definitely don't want to unregister it on endpoint stop or when done > with the client. The whole point of the cache is to hold onto it so it's > reusable. On popular thing to do is create a client, use it once, discard. > Create another client, use it once, discard. Etc... The cache is to help > that. > > I think what might make some sense is to get rid of the schemaCacheMap > entirely. Change the definitionsMap to be a Map<Object, DefPair> map where > DepPair holds a wsdldef and the schema. Thus, the keys would be the same > keys for the wsdl. > > The put/set's would be more expensive as you would need to iterate through > the cache to find the pair. I doubt the map would be very big though so > that may be acceptable. > > Dan > > > > > On May 31, 2008, at 4:55 PM, Bharath Ganesh wrote: > > I figured out a memory leak at WSDLManagerImpl schemaCacheMap. >> The schemaCacheMap here has a weak key - WSDLDefinition and value >> ServiceSchemaInfo. A key,value pair is inserted into this map while >> building >> a service. The entry is never explicitly removed from this map. Since the >> map is a WeakHashMap, it is assumed that when the key WSDLDefinition is >> weakly referenced, the entry would be removed from the map. But it is seen >> that the value ServiceSchemaInfo(the value) holds on to a SchemaInfo which >> in turn holds on to the ServiceInfo, which holds the WSDLDefinition >> through >> the AbstractPropertiesHolder. >> This would mean that the value of the CacheMap always strongly refers to >> the >> key, which would mean the entry would never be removed from the map. >> "*The value objects in a WeakHashMap are held by ordinary strong >> references. >> Thus care should be taken to ensure that value objects do not strongly >> refer >> to their own keys, either directly or indirectly, since that will prevent >> the keys from being discarded" >> >> *This would mean ServiceInfo, OperationInfo, BindingInfo, WSDLDefinition >> would all stay in the VM even after the endpoint is stopped. >> >> One solution I could think of was to explicitly remove the entry on >> endpoint >> stop, instead of relying on the WeakHashMap semantics. This would work >> fine >> for server endpoints. But Is there any way to do so for client endpoints? >> > > --- > Daniel Kulp > [EMAIL PROTECTED] > http://www.dankulp.com/blog > > > > >