[vtkusers] problems with java memory management

Mark Roden mmroden at gmail.com
Wed Nov 24 15:11:21 EST 2010


Hi Sebastian,

Thanks for giving me a place to start.  I'll take a look at my various
pipelines and see where/if I'm doing things like that.  I probably am, since
that kind of line saving is just what I'd do.

I'll let you and the list know.

Mark

On Wed, Nov 24, 2010 at 9:37 AM, Sebastien Jourdain <
sebastien.jourdain at kitware.com> wrote:

> Hi Mark,
>
> it might be related to the way you bind vtk object together. I mean by
> bind something like the following expression.
>
> actor.SetMapper( object.GetMapper() );
>
> In fact VTK can have some issue with reference count if you provide a
> VTK object reference across the C++ layer without going through the
> Java object layer. (Sorry it is not very clear, but it is quite
> difficult to explain.)
>
> So to solve this problem, you should rewrite the above expression like
> that.
>
> vtkDataSetMapper mapper = object.GetMapper();
> actor.SetMapper( mapper );
>
> Hope that helped and please let us know if that solved your problem.
>
> Seb
>
>
> On Tue, Nov 23, 2010 at 11:15 PM, Mark Roden <mmroden at gmail.com> wrote:
> > Hi all,
> >
> > I'm having problems with memory management in java (windows 7, 64 bit and
> 32
> > bit, vtk 5.6).
> >
> > The application loads ~150mb of dicom images (varies from patient to
> > patient), allocates between 1 to 10 binary masks on top of those images,
> and
> > then Does Things, things that include PolyData contours.
> >
> > Once I'm done with an image, I want to completely wipe all instances of
> vtk
> > and start afresh with a new image.
> >
> > So, I'm calling
> >
> > vtkGlobalJavaHash.GC();
> >
> > But that doesn't work, even after I delete all windows and data holders.
> >
> > So, I go ahead and get more aggressive, calling
> >
> > vtkGlobalJavaHash.DeleteAll();
> >
> > This call works somewhat better, but appears to leave ~150 mb behind
> > (coincidentally, the size of the original image).  When I use the
> netbeans
> > memory profiler at this point, I get no indication that this memory is
> > actually in use; I'm seeing the memory allocations via the system
> resources
> > in the task manager.
> >
> > I then try something a bit more drastic:
> >
> >     private int DeleteAllVTKObjects(){
> >         int deleted = 0;
> >         Set entries = vtkGlobalJavaHash.PointerToReference.entrySet();
> >         Iterator iter = entries.iterator();
> >         while (iter.hasNext()) {
> >             Map.Entry entry = (Map.Entry) iter.next();
> >             vtkObjectBase obj = (vtkObjectBase) ((WeakReference)
> > entry.getValue()).get();
> >             if (obj == null) {
> >                 // Delete a garbage collected object using the raw C++
> > pointer.
> >                 long id = ((Long)entry.getKey()).longValue();
> >                 vtkObjectBase.VTKDeleteReference(id);
> >                 entries.remove(entry);
> >                 deleted++;
> >             }
> >             else if (obj != null){
> >                 // Delete a non-garbage collected object.
> >                 // We use Delete() which will call the "real" C++
> Delete()
> >                 // unless Delete() has been called on this Java object
> > before.
> >                 // Delete() will remove from the map so we don't have to.
> >                 obj.Delete();
> >                 deleted++;
> >             }
> >         }
> >         return deleted;
> >     }
> >
> > But that appears to be the same (or no better than)
> > vtkGlobalJavaHash.DeleteAll().
> >
> > So here's the deal: I've got ~140 mb leaking with each image that I open,
> > and the profiler indicates that the leak is not in Java.
> >
> > I'm using the vtkGDCMImageReader to read in images, and this object does
> not
> > (as far as I can see) have a dispose method.  I'm using vtkPolyData
> objects,
> > but again, I'm not seeing dispose methods.  I'm using
> vtkGDCMPolyDataReader
> > and to handle contours, again, no dispose method present.
> >
> > So right now, I'm thinking that either those particular classes have
> leaks
> > on the C++ side, or some memory is just not getting handled and removed
> by
> > the above calls to vtk.
> >
> > Are there other ways I can debug this issue?  I want the user to be able
> to
> > open and close as many images as they want, rather than having to restart
> > the program every ~10 or so images due to instabilities from the leak.
> >
> > Also, due to problems I mentioned previously on the list with changes in
> the
> > vtk libraries, I can't move to the head version of vtk.  If the head
> version
> > has a fix, I can try it, but right now, gdcm and vtk head do not play
> well
> > together at all.  It seems that the vtkStringArrays necessary to read in
> > files on the gdcm side are empty when passed through the java layer in
> 5.7,
> > but not in 5.6 (which I discovered through that error << trick from
> Monday,
> > thanks for that).  I don't know why that is, but since 5.6 works with
> gdcm
> > git head, that's the version I have.
> >
> > Thanks,
> > Mark
> >
> > _______________________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Please keep messages on-topic and check the VTK FAQ at:
> > http://www.vtk.org/Wiki/VTK_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101124/32c73fd0/attachment.htm>


More information about the vtkusers mailing list