Hi Sebastien,<br><br>I&#39;ve made the changes, as in:<br><br><br>        vtkPolyData marchingoutput = marching.GetOutput();<br><br>        stripper.SetInput(marchingoutput);<br><br>instead of <br><br>stripper.SetInput(marching.GetOutput());<br>
<br>But in order for this to be effective, do I need to correct lines like<br><br>        renWin.GetRenderer().AddActor(outlineActor);<br><br>Should that be split, or can I continue to have multiple command stacked like that?  Could the renWin.GetRenderer() leak in the above line?<br>
<br>How about a method that returns something like<br><br>        return stripper.GetOutput();<br><br>Will that leak?<br><br>or <br><br>            for (int j=0; j&lt;cell.GetNumberOfPoints()-1; j++)<br><br>I have a lot of inlining (if that&#39;s the proper term in this context) in my code.  If the only way to solve this problem is to have each individual vtk call be its own call, that&#39;s a pretty big refactor.  So are there certain rules I can use to avoid this? If it&#39;s just making sure that one output doesn&#39;t directly go into another input, that&#39;s straightforward.  Buf it it&#39;s &#39;every time a function with .get&#39; is called, then I need to fix quite a bit more.<br>
<br>This approach does look like it&#39;s pulled the leak down somewhat, but not entirely.<br><br>Mark<br><br><br><br><div class="gmail_quote">On Wed, Nov 24, 2010 at 12:56 PM, Sebastien Jourdain <span dir="ltr">&lt;<a href="mailto:sebastien.jourdain@kitware.com">sebastien.jourdain@kitware.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hi Mark,<br>
<br>
I agree it is a common habit in Java. But this problem ONLY if object<br>
is a vtkObject. If it&#39;s one of your Java object, this is not a<br>
problem.<br>
<br>
Seb<br>
<div><div></div><div class="h5"><br>
On Wed, Nov 24, 2010 at 3:11 PM, Mark Roden &lt;<a href="mailto:mmroden@gmail.com">mmroden@gmail.com</a>&gt; wrote:<br>
&gt; Hi Sebastian,<br>
&gt;<br>
&gt; Thanks for giving me a place to start.  I&#39;ll take a look at my various<br>
&gt; pipelines and see where/if I&#39;m doing things like that.  I probably am, since<br>
&gt; that kind of line saving is just what I&#39;d do.<br>
&gt;<br>
&gt; I&#39;ll let you and the list know.<br>
&gt;<br>
&gt; Mark<br>
&gt;<br>
&gt; On Wed, Nov 24, 2010 at 9:37 AM, Sebastien Jourdain<br>
&gt; &lt;<a href="mailto:sebastien.jourdain@kitware.com">sebastien.jourdain@kitware.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi Mark,<br>
&gt;&gt;<br>
&gt;&gt; it might be related to the way you bind vtk object together. I mean by<br>
&gt;&gt; bind something like the following expression.<br>
&gt;&gt;<br>
&gt;&gt; actor.SetMapper( object.GetMapper() );<br>
&gt;&gt;<br>
&gt;&gt; In fact VTK can have some issue with reference count if you provide a<br>
&gt;&gt; VTK object reference across the C++ layer without going through the<br>
&gt;&gt; Java object layer. (Sorry it is not very clear, but it is quite<br>
&gt;&gt; difficult to explain.)<br>
&gt;&gt;<br>
&gt;&gt; So to solve this problem, you should rewrite the above expression like<br>
&gt;&gt; that.<br>
&gt;&gt;<br>
&gt;&gt; vtkDataSetMapper mapper = object.GetMapper();<br>
&gt;&gt; actor.SetMapper( mapper );<br>
&gt;&gt;<br>
&gt;&gt; Hope that helped and please let us know if that solved your problem.<br>
&gt;&gt;<br>
&gt;&gt; Seb<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Nov 23, 2010 at 11:15 PM, Mark Roden &lt;<a href="mailto:mmroden@gmail.com">mmroden@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; Hi all,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;m having problems with memory management in java (windows 7, 64 bit<br>
&gt;&gt; &gt; and 32<br>
&gt;&gt; &gt; bit, vtk 5.6).<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; The application loads ~150mb of dicom images (varies from patient to<br>
&gt;&gt; &gt; patient), allocates between 1 to 10 binary masks on top of those images,<br>
&gt;&gt; &gt; and<br>
&gt;&gt; &gt; then Does Things, things that include PolyData contours.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Once I&#39;m done with an image, I want to completely wipe all instances of<br>
&gt;&gt; &gt; vtk<br>
&gt;&gt; &gt; and start afresh with a new image.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So, I&#39;m calling<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; vtkGlobalJavaHash.GC();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; But that doesn&#39;t work, even after I delete all windows and data holders.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So, I go ahead and get more aggressive, calling<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; vtkGlobalJavaHash.DeleteAll();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; This call works somewhat better, but appears to leave ~150 mb behind<br>
&gt;&gt; &gt; (coincidentally, the size of the original image).  When I use the<br>
&gt;&gt; &gt; netbeans<br>
&gt;&gt; &gt; memory profiler at this point, I get no indication that this memory is<br>
&gt;&gt; &gt; actually in use; I&#39;m seeing the memory allocations via the system<br>
&gt;&gt; &gt; resources<br>
&gt;&gt; &gt; in the task manager.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I then try something a bit more drastic:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;     private int DeleteAllVTKObjects(){<br>
&gt;&gt; &gt;         int deleted = 0;<br>
&gt;&gt; &gt;         Set entries = vtkGlobalJavaHash.PointerToReference.entrySet();<br>
&gt;&gt; &gt;         Iterator iter = entries.iterator();<br>
&gt;&gt; &gt;         while (iter.hasNext()) {<br>
&gt;&gt; &gt;             Map.Entry entry = (Map.Entry) iter.next();<br>
&gt;&gt; &gt;             vtkObjectBase obj = (vtkObjectBase) ((WeakReference)<br>
&gt;&gt; &gt; entry.getValue()).get();<br>
&gt;&gt; &gt;             if (obj == null) {<br>
&gt;&gt; &gt;                 // Delete a garbage collected object using the raw C++<br>
&gt;&gt; &gt; pointer.<br>
&gt;&gt; &gt;                 long id = ((Long)entry.getKey()).longValue();<br>
&gt;&gt; &gt;                 vtkObjectBase.VTKDeleteReference(id);<br>
&gt;&gt; &gt;                 entries.remove(entry);<br>
&gt;&gt; &gt;                 deleted++;<br>
&gt;&gt; &gt;             }<br>
&gt;&gt; &gt;             else if (obj != null){<br>
&gt;&gt; &gt;                 // Delete a non-garbage collected object.<br>
&gt;&gt; &gt;                 // We use Delete() which will call the &quot;real&quot; C++<br>
&gt;&gt; &gt; Delete()<br>
&gt;&gt; &gt;                 // unless Delete() has been called on this Java object<br>
&gt;&gt; &gt; before.<br>
&gt;&gt; &gt;                 // Delete() will remove from the map so we don&#39;t have<br>
&gt;&gt; &gt; to.<br>
&gt;&gt; &gt;                 obj.Delete();<br>
&gt;&gt; &gt;                 deleted++;<br>
&gt;&gt; &gt;             }<br>
&gt;&gt; &gt;         }<br>
&gt;&gt; &gt;         return deleted;<br>
&gt;&gt; &gt;     }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; But that appears to be the same (or no better than)<br>
&gt;&gt; &gt; vtkGlobalJavaHash.DeleteAll().<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So here&#39;s the deal: I&#39;ve got ~140 mb leaking with each image that I<br>
&gt;&gt; &gt; open,<br>
&gt;&gt; &gt; and the profiler indicates that the leak is not in Java.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;m using the vtkGDCMImageReader to read in images, and this object does<br>
&gt;&gt; &gt; not<br>
&gt;&gt; &gt; (as far as I can see) have a dispose method.  I&#39;m using vtkPolyData<br>
&gt;&gt; &gt; objects,<br>
&gt;&gt; &gt; but again, I&#39;m not seeing dispose methods.  I&#39;m using<br>
&gt;&gt; &gt; vtkGDCMPolyDataReader<br>
&gt;&gt; &gt; and to handle contours, again, no dispose method present.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; So right now, I&#39;m thinking that either those particular classes have<br>
&gt;&gt; &gt; leaks<br>
&gt;&gt; &gt; on the C++ side, or some memory is just not getting handled and removed<br>
&gt;&gt; &gt; by<br>
&gt;&gt; &gt; the above calls to vtk.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Are there other ways I can debug this issue?  I want the user to be able<br>
&gt;&gt; &gt; to<br>
&gt;&gt; &gt; open and close as many images as they want, rather than having to<br>
&gt;&gt; &gt; restart<br>
&gt;&gt; &gt; the program every ~10 or so images due to instabilities from the leak.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Also, due to problems I mentioned previously on the list with changes in<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; vtk libraries, I can&#39;t move to the head version of vtk.  If the head<br>
&gt;&gt; &gt; version<br>
&gt;&gt; &gt; has a fix, I can try it, but right now, gdcm and vtk head do not play<br>
&gt;&gt; &gt; well<br>
&gt;&gt; &gt; together at all.  It seems that the vtkStringArrays necessary to read in<br>
&gt;&gt; &gt; files on the gdcm side are empty when passed through the java layer in<br>
&gt;&gt; &gt; 5.7,<br>
&gt;&gt; &gt; but not in 5.6 (which I discovered through that error &lt;&lt; trick from<br>
&gt;&gt; &gt; Monday,<br>
&gt;&gt; &gt; thanks for that).  I don&#39;t know why that is, but since 5.6 works with<br>
&gt;&gt; &gt; gdcm<br>
&gt;&gt; &gt; git head, that&#39;s the version I have.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks,<br>
&gt;&gt; &gt; Mark<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the VTK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>