navcat / pyv8

Automatically exported from code.google.com/p/pyv8
0 stars 0 forks source link

Memory leak with evaluating pure JS #230

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?

import os, gc
import PyV8
def get_mem():
    a = os.popen('ps -p %d -o %s | tail -1' % (os.getpid(),"vsize,rss,pcpu")).read()
    a = a.split()
    return (int(a[0]), int(a[1]))

def main():
    js_code = 'function hello(name) { return "Hello " + name + " from Javascript"; }'

    for i in xrange(10**5):
        with PyV8.JSContext() as ctx:
            ctx.eval(js_code)
            PyV8.JSEngine.collect()
        if i % 10000:
            print get_mem()

if __name__ == "__main__":
    main()

What is the expected output? What do you see instead?

I watch increasing consuming memory. It's not so evident on small JS, but it 
grows quickly with 300Kb JS file 

What version of the product are you using? On what operating system?

Centos 6.4, PyV8 1.0

Please provide any additional information below.

PyV8.JSEngine.collect() doesn't seem to influence on memory consuming

Original issue reported on code.google.com by alexan...@bekbulatov.ru on 9 Apr 2014 at 12:48

GoogleCodeExporter commented 9 years ago
This one would be more correct example

    for i in xrange(10**5):
        with PyV8.JSContext() as ctx:
            ctx.eval(js_code)
        if i % 10000:
            PyV8.JSEngine.collect()
            gc.collect()
            print get_mem()

Original comment by alexan...@bekbulatov.ru on 9 Apr 2014 at 1:22

GoogleCodeExporter commented 9 years ago
1. Test 1: Eval empty string

js_code = ''

(741580, 16600)
...
(741580, 16600)

Looks ok!

2. Test 2: Eval small js code

js_code = 'function hello(name) { return "Hello " + name + " from Javascript"; 
}'

(741576, 16596)
(741580, 16636)
(741580, 16644)
...
(747648, 22080)

Then I stopped. It leaks but not so much

3. Test 3: Eval 300Kb js file

js_code = open('bem/touch.bundles/rubric/rubric.xml.js', 
'r').read().decode('utf-8')

(744060, 20436)
(745880, 21796)
(746904, 22272)
...
(1148336, 311196)
(1148336, 311556)

This is huge leak. Test finished with 

PyV8.JSError: JSError: <CALL_AND_RETRY_LAST> Allocation failed - process out of 
memory

Thank you in advance for any help.

Original comment by alexan...@bekbulatov.ru on 10 Apr 2014 at 6:40

GoogleCodeExporter commented 9 years ago
I think the workaround posted in my issue might help you as well, see today's 
update: https://code.google.com/p/pyv8/issues/detail?id=229

Original comment by mmueller...@gmail.com on 4 May 2014 at 11:55