Xojo Conferences
XDCMay2019MiamiUSA

[MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak? (MBS Xojo Plugin Mailinglist archive)

Back to the thread list
Previous thread: [MBS] Querying for state of USB devices
Next thread: [MBS] [ANN] 12.1pr1


[MBS] PortAudio   -   Garth Hjelte
  [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?   -   Michael Diehr
   Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?   -   Michael Diehr
   Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?   -   Michael Diehr
   Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?   -   Christian Schmitz

[MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?
Date: 04.02.12 17:39 (Sat, 4 Feb 2012 08:39:13 -0800)
From: Michael Diehr
Hi Christian,

I've discovered what I believe is a small but troubling memory leak in the method
HTMLViewer.EvaluateJavaScriptMBS on mac and the corresponding function IERunJavaScriptMBS.

In tests where I call either function about 50 times per second with small commands, I'm seeing leaks that can be as fast as 100KB/second. The commands are short javascript functions which query the play status of a plugin (flash or quicktime or html5 video).

Since it's leaking on both Mac and Windows when querying either SWF or QuickTime or HTML5 video objects, this suggests to me that like the leak may be in MBS, rather than, say a leak in IE or WebKit or just Flash or QuickTime plugins.

I'm seeing this in MBS 10.1.

Questions:
* can you see an obvious place in your code where the leak is happening?
* can you fix it?
* if so, can I pay you to make a custom build of 10.1 (I need to issue a quick update of my software to fix this and prefer to not update to a later MBS for obvious unit-test reasons).

Thanks!

n.b.: the leaked memory appears to be released if I reload a blank page in the HTMLViewer (on mac) or if I issue htmlViewer.close (win32). Although this is a workaround for the leak, there are cases where it's not practical to reload the page as some customers expect the software to be running 24/7 without interruption.

_______________________________________________
Mbsplugins_monkeybreadsoftware.info mailing list
<email address removed>
https://ml01.ispgateway.de/mailman/listinfo/mbsplugins_monkeybreadsoftware.info

Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?
Date: 05.02.12 00:32 (Sat, 4 Feb 2012 15:32:09 -0800)
From: Michael Diehr
On Feb 4, 2012, at 2:38 PM, Michael Diehr wrote:
> [...]
> Timer1.action
> dim s as string = htmlviewer1.EvaluateJavaScript("return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';")
>
> The speed of the leak seems proportional to the size of the string returned.
> So my guess is that the string being returned from javascript to RB is not being freed ever.

More testing ... these two different javascript commands both leak at the same speed, so I think perhaps it's the string being passed in to the command that leaks, not the string being returned:

Timer1.action
static xxx as string // a long string to leak memory faster
if xxx = "" then // initialize first time only
for i as integer = 1 to 1000
xxx = xxx + "0"
next
end if

if Keyboard.AsyncShiftKey then // toggle the shift key at runtime to test options
cmd = "var x = '" + xxx + "'; return '' ;"
else
cmd = "return '" + xxx + "';"
end if

result = htm.EvaluateJavaScriptMBS(cmd)
_______________________________________________
Mbsplugins_monkeybreadsoftware.info mailing list
<email address removed>
https://ml01.ispgateway.de/mailman/listinfo/mbsplugins_monkeybreadsoftware.info

Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?
Date: 04.02.12 23:38 (Sat, 4 Feb 2012 14:38:07 -0800)
From: Michael Diehr
On Feb 4, 2012, at 12:12 PM, Christian Schmitz wrote:

>
> Am 04.02.2012 um 17:39 schrieb Michael Diehr:
>
>> Hi Christian,
>>
>> I've discovered what I believe is a small but troubling memory leak in the method
>> HTMLViewer.EvaluateJavaScriptMBS on mac and the corresponding function IERunJavaScriptMBS.
>
> Okay, could you make a sample project reproducing it?

It's very easy to reproduce (sent you a project offlist).

this will do it:

Timer1.action
dim s as string = htmlviewer1.EvaluateJavaScript("return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';")

The speed of the leak seems proportional to the size of the string returned.
So my guess is that the string being returned from javascript to RB is not being freed ever.

> I can't reproduce it here easily, but that may be due the setup with 12.1pr1 plugins, RS 2011r4 and Mac OS X 10.7.2.

Tested and leaking with 10.6.8 and MBS 12.1pr1

>> In tests where I call either function about 50 times per second with small commands, I'm seeing leaks that can be as fast as 100KB/second. The commands are short javascript functions which query the play status of a plugin (flash or quicktime or html5 video).
>
> Well, NSAutoreleasePoolMBS class exists and may be useful on Mac if that is due to a pool not being cleared.
>
>> Since it's leaking on both Mac and Windows when querying either SWF or QuickTime or HTML5 video objects, this suggests to me that like the leak may be in MBS, rather than, say a leak in IE or WebKit or just Flash or QuickTime plugins.
>
> You can use Instruments.app (coming with Xcode) to find the source of the leak.
>
>> * can you see an obvious place in your code where the leak is happening?
>
> No.
>
>> * can you fix it?
>
> No.
>
>> * if so, can I pay you to make a custom build of 10.1 (I need to issue a quick update of my software to fix this and prefer to not update to a later MBS for obvious unit-test reasons).
>
> We could discuss that off list, but I bet it'll be a lot of work.

let's see how it goes?

>
>> n.b.: the leaked memory appears to be released if I reload a blank page in the HTMLViewer (on mac) or if I issue htmlViewer.close (win32). Although this is a workaround for the leak, there are cases where it's not practical to reload the page as some customers expect the software to be running 24/7 without interruption.
>
> Not sure what you do, but you could at least measure free memory with other plugin functions.
> So you could warn user or restart app when memory is low and you have a chance to do so.

unfortunately it's an automated process that runs w/o user intervention.

>
> Greetings
> Christian
>
> --
> See you in Orlando, Florida for Real World 2012
>
> More details and registration here:
> http://www.realsoftware.com/community/realworld.php
>
> _______________________________________________
> Mbsplugins_monkeybreadsoftware.info mailing list
> <email address removed>
> https://ml01.ispgateway.de/mailman/listinfo/mbsplugins_monkeybreadsoftware.info

_______________________________________________
Mbsplugins_monkeybreadsoftware.info mailing list
<email address removed>
https://ml01.ispgateway.de/mailman/listinfo/mbsplugins_monkeybreadsoftware.info

Re: [MBS] HTMLViewer.EvaluateJavaScriptMBS memory Leak?
Date: 04.02.12 21:12 (Sat, 4 Feb 2012 21:12:07 +0100)
From: Christian Schmitz

Am 04.02.2012 um 17:39 schrieb Michael Diehr:

> Hi Christian,
>
> I've discovered what I believe is a small but troubling memory leak in the method
> HTMLViewer.EvaluateJavaScriptMBS on mac and the corresponding function IERunJavaScriptMBS.

Okay, could you make a sample project reproducing it?

I can't reproduce it here easily, but that may be due the setup with 12.1pr1 plugins, RS 2011r4 and Mac OS X 10.7.2.

> In tests where I call either function about 50 times per second with small commands, I'm seeing leaks that can be as fast as 100KB/second. The commands are short javascript functions which query the play status of a plugin (flash or quicktime or html5 video).

Well, NSAutoreleasePoolMBS class exists and may be useful on Mac if that is due to a pool not being cleared.

> Since it's leaking on both Mac and Windows when querying either SWF or QuickTime or HTML5 video objects, this suggests to me that like the leak may be in MBS, rather than, say a leak in IE or WebKit or just Flash or QuickTime plugins.

You can use Instruments.app (coming with Xcode) to find the source of the leak.

> * can you see an obvious place in your code where the leak is happening?

No.

> * can you fix it?

No.

> * if so, can I pay you to make a custom build of 10.1 (I need to issue a quick update of my software to fix this and prefer to not update to a later MBS for obvious unit-test reasons).

We could discuss that off list, but I bet it'll be a lot of work.

> n.b.: the leaked memory appears to be released if I reload a blank page in the HTMLViewer (on mac) or if I issue htmlViewer.close (win32). Although this is a workaround for the leak, there are cases where it's not practical to reload the page as some customers expect the software to be running 24/7 without interruption.

Not sure what you do, but you could at least measure free memory with other plugin functions.
So you could warn user or restart app when memory is low and you have a chance to do so.

Greetings
Christian