Skip to content

potential memory leak with set_text in matrixportal/portalbase #70

Closed
adafruit/Adafruit_CircuitPython_PortalBase
#20
@grookill

Description

@grookill

memory_test.zip

I've been working on a clock/news scroller similar to the code in https://learn.adafruit.com/matrix-portal-new-guide-scroller. I have my own JSON server that I use to consolidate different news sources and then will present a standardized data stream (headlines) to systems that ask.

I ran into memory issues and started to chase it down. It appears that "matrixportal.set_text" leaks memory and eventually will cause a crash. The workaround is to use gc.collect() after "set_text" but the problem in "set_text" really should be resolved.

I created a test script (which can be found at the end) and came up with these results:

Adafruit CircuitPython 6.2.0-beta.3 on 2021-03-04; Adafruit Matrix Portal M4 with samd51j19

With gc.collect()

code.py output:
free mem: 50432
loop: 1 at beggining of loop free mem: 44416
after first gc.collect free mem: 44432
before first set_text free mem: 44432
before second set_text free mem: 43440
before scroll_text free mem: 37824
at end of loop free mem: 37824
...
...
loop: 100 at beggining of loop free mem: 35632
after first gc.collect free mem: 35632
before first set_text free mem: 35632
before second set_text free mem: 35632
before scroll_text free mem: 34656
at end of loop free mem: 34656
Start: 44416 End: 34656 Diff: -9760

Without gc.collect:
code.py output:
free mem: 50528
loop: 1 at beggining of loop free mem: 44416
after first gc.collect free mem: 44416
before first set_text free mem: 44416
before second set_text free mem: 40528
before scroll_text free mem: 13136
at end of loop free mem: 13136
...
...
after first gc.collect free mem: 1472
before first set_text free mem: 1472
before second set_text free mem: 33968
before scroll_text free mem: 1456
at end of loop free mem: 1456
loop: 75 at beggining of loop free mem: 1456
after first gc.collect free mem: 1456
before first set_text free mem: 1456
before second set_text free mem: 33008
Traceback (most recent call last):
File "code.py", line 64, in
File "adafruit_portalbase/init.py", line 245, in set_text
File "adafruit_display_text/label.py", line 138, in init
File "adafruit_display_text/label.py", line 324, in _update_text
MemoryError: memory allocation failed, allocating 512 bytes

Code done running.

=======================================================

Adafruit CircuitPython 6.1.0 on 2021-01-21; Adafruit Matrix Portal M4 with samd51j19

with gc.collect:

code.py output:
free mem: 51232
loop: 1 at beggining of loop free mem: 44400
after first gc.collect free mem: 44416
before first set_text free mem: 44416
before second set_text free mem: 43440
before scroll_text free mem: 37696
at end of loop free mem: 37696

loop: 99 at beggining of loop free mem: 36656
after first gc.collect free mem: 36656
before first set_text free mem: 36656
before second set_text free mem: 36656
before scroll_text free mem: 35600
at end of loop free mem: 35600
loop: 100 at beggining of loop free mem: 35600
after first gc.collect free mem: 35600
before first set_text free mem: 35600
before second set_text free mem: 35600
before scroll_text free mem: 34544
at end of loop free mem: 34544
Start: 44400 End: 34544 Diff: -9856

Without gc.collect:

code.py output:
free mem: 51232
loop: 1 at beggining of loop free mem: 44400
after first gc.collect free mem: 44400
before first set_text free mem: 44400
before second set_text free mem: 40528
before scroll_text free mem: 13008
at end of loop free mem: 13008
...
...
loop: 100 at beggining of loop free mem: 22704
after first gc.collect free mem: 22704
before first set_text free mem: 22704
before second set_text free mem: 18832
before scroll_text free mem: 2864
at end of loop free mem: 2864
Start: 44400 End: 2864 Diff: -41536

=======================================================================

Test script is attached as "memory_test.zip"

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions