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