Hi Yan, Ioannis,

Thanks for pointing your finger on this hot spot! The GC overhead is clearly
an issue that needs to be fixed and definitely worth a ticket in GitHub.

A first and easy solution is to replace those two iterator objects with
regular loops to prevent unnecessary garbage collection.

The second and harder solution will require to have the controller thread
sleep by default (as long as possible to prevent unnecessary CPU cycles) and
indeed interrupt it when an event occurs: 
  1) NIO event detected
  2) Connection event detected (new connection/message/entity chunk to
process)

See this wiki pages to details on this connector and the pending tasks:
http://wiki.restlet.org/developers/172-restlet/g3/354-restlet.html

Best regards,
Jerome
--
http://www.restlet.com
http://twitter.com/#!/jlouvel


-----Message d'origine-----
De : Ioannis Mavroukakis [mailto:[email protected]] 
Envoyé : jeudi 21 juin 2012 01:05
À : [email protected]
Objet : Re: Idling app has ~2MB of garbage collected every 30 seconds

Yes it could but you would you not end up having the overhead of context
switching from the thrown thread interrupts? On a low resource device this
can't be the best of situations I imagine. 

On 21 Jun 2012, at 00:16, Yan Zhou <[email protected]> wrote:

> Any objections if the following is added as a new issue in the issue
tracker?
> 
> I am thinking that the selectKeys(sleepTime) call below really should be
able to return immediately (thread interrupted, for example) if there has
been a connection state change that needs attention. The sleepTime will then
have little effect on how soon or how often controlConnections() is run.
> 
> Thanks,
> Yan Zhou
> 
>> Hi,
>> 
>> We are noticing that an idling Restlet server has about 2MB of garbage
collected in 30 seconds.
>> 
>> I think I tracked it down to the loop in ConnectionController that
invokes the method below:
>> 
>> 
>>    @Override
>>    protected void doRun(long sleepTime) throws IOException {
>>        super.doRun(sleepTime);
>>        registerKeys();
>>        updateKeys();
>>        selectKeys(sleepTime);
>>        controlConnections();
>>    }
>> 
>> The sleepTime comes from the controllerSleepTimeMs parameter, which is 1
by default.
>> 
>> So if the loop generates 60 bytes of garbage (2 iterator objects), it'd
lead to: 60 x 1000 x 30 = 1,800,000 bytes or 1.8MB every 30 seconds.
>> 
>> Can I ask if this is a known issue? And if there are workarounds?
>> 
>> I have already tried tweaking the controllerSleepTimeMs and changing it
to something like 30000 (30 seconds). Every connection then takes up to 30
seconds to close - probably not acceptable as a solution.
>> 
>> Additional info: Restlet 2.1 rc4 Android edition.
>> 
>> Thanks,
>> Yan Zhou
> 
> ------------------------------------------------------
>
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=29722
83

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=29723
87

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2972533

Reply via email to