NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
After struggling with this problem for a week, I think I know why I'm having trouble. I don't, however, know how to fix it, so I want to troll this list one more time. First, the problem statement: I can run VisAD as an applet, and it works beautifully the first time I hit the page. If I go to another page and then return to the page with the VisAD applet, then my applet appears to hang, no matter how simple I make it. Here's my theory about what's going wrong: Under IE 5.0, using the Java plug-in 1.3, the JVM loads my applet and visad.jar the first time they're needed. The next time around, the browser calls Class.newInstance() (which performs a shallow copy) to generate a new version of my applet class, while keeping the instantiations of any classes that were loaded from the visad.jar. I know that VisAD is still loaded, since I can call ScalarMap.getScalarName("myscalar"), for example. The instance variables in my applet are all new, though my static variables are still the same. Now the trouble starts. That first instance of my class is gone for good, so the garbage collector can start picking it to pieces, and since there are no explicit references to the information stored in VisAD's namespace, I think that the memory VisAD has allocated starts to be picked apart as well. The classloader doesn't bother to reload visad.jar from scratch, since it knows that it loaded visad.jar once already, and assumes that I've kept explicit pointers to any memory I want saved. So now I'm in deep trouble, as I stand on instances of VisAD classes that are dissolving beneath me. Note: I think this IS NOT a VisAD bug (I'd call it instead a browser and/or Java plug-in bug). There may, however, be aspects of VisAD that would allow me to get around the problem. If, for example, I could get a pointer to the root of the data structure that VisAD uses internally, then I could set a static variable within my program to point to it, and everything would be protected from the GC, and I could use the variables I created the first time through. Or, if there were a way for me to tell VisAD to start fresh and give me all new variables, then, while loading would be slower, at least everything would run reliably. Alternatively, if there were a way to tell VisAD to unload everything it has allocated, then that would do it too. Maybe subclassing the classLoader to make it load new versions instead of referencing old versions would work, but I'm not certain. Don't bother suggesting that I simply make every VisAD variable that I use static, since I've tried and that approach doesn't work (perhaps implying that my solution #1 would fail too?). I imagine that there are other approaches, but since I don't know how VisAD stores its internal variables I don't have any other ideas right now. I would really like to use VisAD in our front end, and I feel as if I'm 95% of the way there, with only this last big problem standing in my way. Is there anybody who can shed some light on my troubles? Please contact me offline if you're interested and want to see my source, or if I could perform any work which might then be folded back into somebody else's project (as well as my own). Ben balexander@xxxxxxxxxx 781-994-0428
visad
archives: