[Engine-devel] Java process increasing resident memory
Michael Pasternak
mpastern at redhat.com
Sun Feb 3 09:56:33 UTC 2013
On 02/03/2013 11:30 AM, Moti Asayag wrote:
> On 02/03/2013 10:56 AM, Michael Pasternak wrote:
>> On 01/31/2013 12:50 AM, Moti Asayag wrote:
>>> On 01/29/2013 10:27 AM, navin p wrote:
>>>>> Hi,
>>>>> I wrote this sample code and the resident memory of the process is
>>>>> increasing gradually over time. What could be the reason ? I don't see
>>>>> any obvious leaks in my program. Could it be that the API is not
>>>>> freeing/deleting memory ?
>>> By monitoring the program, it seems that the failure is due to constant
>>> threads creation by invoking the "new API()" call:
>>>
>>> Exception in thread "main" java.lang.OutOfMemoryError: unable to create
>>> new native thread
>>> at java.lang.Thread.start0(Native Method)
>>> at java.lang.Thread.start(Thread.java:691)
>>> at
>>> org.ovirt.engine.sdk.web.ConnectionsPoolBuilder.createPoolingClientConnectionManager(ConnectionsPoolBuilder.java:182)
>>> at
>>> org.ovirt.engine.sdk.web.ConnectionsPoolBuilder.createDefaultHttpClient(ConnectionsPoolBuilder.java:160)
>>> at
>>> org.ovirt.engine.sdk.web.ConnectionsPoolBuilder.build(ConnectionsPoolBuilder.java:234)
>>> at org.ovirt.engine.sdk.Api.<init>(Api.java:82)
>>> at collectHosts.main(collectHosts.java:102)
>>>
>>>
>>> By pulling the API instantiation outside of the loop, problem solved,
>>> since only a single thread is created to monitor the idle/expired
>>> connections.
>>
>> Thanks Moti,
>>
>> I already suggested navin to take SDK proxy initiation out of his while loop.
>>
>>>
>>>
>>> Michael, wouldn't you suggest adding some sort of API.shutdown() method
>>> in order to release resources used by it including the connection
>>> monitor and any other live connections if exists?
>>
>> no need for that, in SDK i have dedicated thread (watchdog) for that.
>>
>
> But what if you wish to instantiate several API classes? each of them
> will leave a detached (daemon) thread for monitoring the connections.
>
> I suggested to perform inside the API.shutdown() release of any resource
> used by it, including the watchdog thread. Else there is a sort of
> thread-leak: when you have no longer reference to the API object, yet
> the thread used to clean connections open by it is still running.
Good point Moti (in terms of self cleanup), but since SDK is used as infrastructure
and not re-initiated/closed during consuming application lifetime, i'm not concerned
about this,
but again this is definitely something that can be implemented in the one
of next releases.
>
>>>
>>
>>
>
--
Michael Pasternak
RedHat, ENG-Virtualization R&D
More information about the Engine-devel
mailing list