<div dir="ltr">We put a log message in the destructor of the servant class to ensure that the object clean-up was happening correctly. We even put additional _remove_refs in the code to force a segfault condition to verify that reference counting was triggering correctly. We ran a test to place 100000 NamedCounterImpl servants into a child POA using the AddNamedCounter method. We then followed up with calling the RemoveNamedCounter method with the same name sequence. <br>
<br>..... Output from server process, 100000 calls to AddNamedCounter<br><br>Counter goober_99995 added with a value of 0<br>Counter goober_99996 added with a value of 0<br>Counter goober_99997 added with a value of 0<br>
Counter goober_99998 added with a value of 0<br>Counter goober_99999 added with a value of 0<br>omniORB: Deinitialising omniDynamic library.<br><br><br>..... Output from server process, 100000 calls to RemovedNamedCounter<br>
<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:84 - START ..... RemoveNamedCounter goober_99995<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:95 - RemoveNamedCounter:  NamedCount goober_99995<br>2014-02-03 15:55:36 INFO  NamedCounter:23 - DTOR NamedCounter: goober_99995&quot; = 0<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:105 - RemoveNamedCounter: Remove from List:goober_99995<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:108 - END ..... RemoveNamedCounter goober_99995<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:84 - START ..... RemoveNamedCounter goober_99996<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:95 - RemoveNamedCounter:  NamedCount goober_99996<br>2014-02-03 15:55:36 INFO  NamedCounter:23 - DTOR NamedCounter: goober_99996&quot; = 0<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:105 - RemoveNamedCounter: Remove from List:goober_99996<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:108 - END ..... RemoveNamedCounter goober_99996<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:84 - START ..... RemoveNamedCounter goober_99997<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:95 - RemoveNamedCounter:  NamedCount goober_99997<br>
2014-02-03 15:55:36 INFO  NamedCounter:23 - DTOR NamedCounter: goober_99997&quot; = 0<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:105 - RemoveNamedCounter: Remove from List:goober_99997<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:108 - END ..... RemoveNamedCounter goober_99997<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:84 - START ..... RemoveNamedCounter goober_99998<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:95 - RemoveNamedCounter:  NamedCount goober_99998<br>2014-02-03 15:55:36 INFO  NamedCounter:23 - DTOR NamedCounter: goober_99998&quot; = 0<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:105 - RemoveNamedCounter: Remove from List:goober_99998<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:108 - END ..... RemoveNamedCounter goober_99998<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:84 - START ..... RemoveNamedCounter goober_99999<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:95 - RemoveNamedCounter:  NamedCount goober_99999<br>2014-02-03 15:55:36 INFO  NamedCounter:23 - DTOR NamedCounter: goober_99999&quot; = 0<br>2014-02-03 15:55:36 INFO  NamedCounterFactory:105 - RemoveNamedCounter: Remove from List:goober_99999<br>
2014-02-03 15:55:36 INFO  NamedCounterFactory:108 - END ..... RemoveNamedCounter goober_99999<br><br><br><br>The child POA was created using the following policy list:<br><br>        policy_list.length(pstart+1);<br>        policy_list[pstart] = parent-&gt;create_request_processing_policy(PortableServer::USE_ACTIVE_OBJECT_MAP_ONLY);<br>
        pstart++;<br>        policy_list.length(pstart+1);<br>        policy_list[pstart] = parent-&gt;create_lifespan_policy(PortableServer::TRANSIENT);<br>        pstart++;<br>        policy_list.length(pstart+1);<br>        policy_list[pstart] = parent-&gt;create_id_assignment_policy(PortableServer::SYSTEM_ID);<br>
        pstart++;<br>        policy_list.length(pstart+1);<br>        policy_list[pstart] = parent-&gt;create_thread_policy(PortableServer::ORB_CTRL_MODEL);<br>        pstart++;<br>        policy_list.length(pstart+1);<br>
    policy_list[pstart] = parent-&gt;create_servant_retention_policy(PortableServer::RETAIN);<br>        pstart++;<br><br><br>For our tests we used the top command and isolated the server process and then recorded the RES value for each step of test.  We are running on CentOS 6.3 x86_64, with omniORB 4.1.7. <br>
<br>/***<br>  .... Snipet from NamedCounterFactory<br>  <br>  **/<br><br><br>void NamedCounterFactoryImpl::AddNamedCounter(<br>   const char* name, <br>   CORBA::Long initialValue)<br>{<br><br>  LOG4CXX_INFO(logger, &quot;START ..... AddNamedCounter &quot; &lt;&lt; name );<br>
   CounterContainer::const_iterator it = m_counters.find(string(name));<br><br>   if (it != m_counters.end())<br>   {<br>      // found<br>      throw NamedCounterFactory::CounterExists(name);<br>   }<br><br>   LOG4CXX_INFO(logger, &quot;AddNamedCount  Create NamedCounter &quot; &lt;&lt; name );x<br>
   PortableServer::Servant_var&lt;NamedCounterImpl&gt; svt = new NamedCounterImpl(name, initialValue);<br>   try {<br><br>     LOG4CXX_INFO(logger, &quot;AddNamedCount  Add to POA, NamedCounter &quot; &lt;&lt; name );x<br>
     PortableServer::POA_var poa = corba::RootPOA()-&gt;find_POA(&quot;NamedCounterImpl::POA&quot;, 1);<br>     if ( !CORBA::is_nil(poa) ) {<br><br>       PortableServer::ObjectId_var oid = poa-&gt;activate_object(svt);<br>
       <a href="http://svt.in">svt.in</a>()-&gt;m_objectID = oid;<br>     }<br>     else {<br>       LOG4CXX_WARN(logger, &quot;AddNamedCounter, Could not get POA, NamedCounterImpl::POA&quot; );<br>     }<br>   }<br>   catch(...) {<br>
<br>   // save off object<br>   m_counters.insert(CounterContainer::value_type(name, <a href="http://svt.in">svt.in</a>()));<br><br>  LOG4CXX_INFO(logger, &quot;END ..... AddNamedCounter &quot; &lt;&lt; name );<br><br>}<br>
<br><br>void NamedCounterFactoryImpl::RemoveNamedCounter(const char* name)<br>{<br><br>  LOG4CXX_INFO(logger, &quot;START ..... RemoveNamedCounter &quot; &lt;&lt; name );<br><br>  CounterContainer::iterator it = m_counters.find(string(name));<br>
<br>  if (it == m_counters.end())<br>    {<br>      throw NamedCounterFactory::NoCounterExists(name);<br>    }<br><br>  NamedCounterImpl *nc_ptr = it-&gt;second;<br><br>  LOG4CXX_INFO(logger, &quot;RemoveNamedCounter:  NamedCount &quot; &lt;&lt; name   );<br>
  PortableServer::POA_var poa = corba::RootPOA()-&gt;find_POA(&quot;NamedCounterImpl::POA&quot;, 0);<br><br>   try {<br>     poa-&gt;deactivate_object(nc_ptr-&gt;m_objectID);<br>   }<br>   catch(...) {<br>     LOG4CXX_ERROR(logger, &quot;RemoveNamedCounter: Deactivate NamedCount Failed:&quot; &lt;&lt; name  );<br>
   }<br><br>   LOG4CXX_INFO(logger, &quot;RemoveNamedCounter: Remove from List:&quot; &lt;&lt; name   );<br>  m_counters.erase(it);   <br><br>  LOG4CXX_INFO(logger, &quot;END ..... RemoveNamedCounter &quot; &lt;&lt; name );<br>
}<br><br><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jan 31, 2014 at 11:31 AM, Duncan Grisby <span dir="ltr">&lt;<a href="mailto:duncan@grisby.org" target="_blank">duncan@grisby.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Wed, 2014-01-29 at 10:25 -0500, Jason Hein wrote:<br>
<br>
&gt; We are seeing an issue when using a POA to capture servants as they<br>
&gt; are activated and deactivated. The memory size of the  server program<br>
&gt; that manages the POA is growing as servants are  being activated by<br>
&gt; the POA. Conversely, when we are deactivating those same servants and<br>
&gt; removing all references to the object to initiate object destruction,<br>
&gt; we are not seeing a reduction in memory size for the server program.<br>
&gt; Instead, the memory size remains consistent when the last object was<br>
&gt; activated by the POA.<br>
<br>
</div>Are you certain that you are getting your servant reference counting<br>
right?  Have you added logging to your servant classes&#39; destructors to<br>
confirm that they are running?<br>
<br>
How are you measuring the memory usage?  On some platforms, the OS often<br>
does not reclaim freed process memory. When the process frees memory, it<br>
doesn&#39;t give it back to the OS but instead holds onto it for future<br>
allocations. Do you see your process grow continuously over time, or<br>
does it just get big and then plateau?<br>
<span class="HOEnZb"><font color="#888888"><br>
Duncan.<br>
<br>
--<br>
 -- Duncan Grisby         --<br>
  -- <a href="mailto:duncan@grisby.org">duncan@grisby.org</a>     --<br>
   -- <a href="http://www.grisby.org" target="_blank">http://www.grisby.org</a> --<br>
<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br>Jason J Hein<br>Objective Solutions, Inc.<br><a href="mailto:jason.j.hein@objectivesolutions.com" target="_blank">jason.j.hein@objectivesolutions.com</a><br>
703.856.2840
</div>