[MAPSERVER-USERS] Antwort: Re: leaking memory in java mapscript (was Re: thread safety)
rich.fromm
nospam420 at yahoo.com
Thu Feb 21 14:30:36 PST 2008
Benedikt Rothe wrote:
>
> It's easier to watch the SWIG-generated JNI-Code in
> mapscript/java/mapscript_wrap.c
> Example:
> mapscriptJNI.delete_imageObj(swigCPtr);
> is implemented by the C-function
> SWIGEXPORT jbyteArray JNICALL
> Java_edu_umn_gis_mapscript_mapscriptJNI_imageObj_1getBytes
>
>> confirm that the caller must free the returned array (with gdFree()).
> At the end of the long-named C-function you'll find a call to gdFree
>
> Can you estimate how much memory is lost in each step of your
> testprogram? Is it approx. the size of the image?
>
I do see the gdFree() call. Nevertheless, just to take the SWIG version
issue
hopefully off of the table, I tried recompiling everything on debian etch
(4.0), which has a dpkg for swig 1.3.29. I still get the leak.
Running my test for 100 iterations, it leaks approximately 30 MB. Which is
a
little bit more than 300 KB per iteration:
(/ (* 30 1024 1024) 100)
314572
Note that this figure is approximate, since the 30 MB is just from top.
The leak is independent of the image size. I get the same amount of leaking
with a test image of 79813 bytes and one of 30328 bytes. If I run 200
iterations instead of 100, the amount that is leaked doubles.
I have finally been able to successfully run a single iteration in valgrind
and have it report a leak in the code:
--- begin ---
==21154== 41,600 bytes in 65 blocks are possibly lost in loss record 46 of
55
==21154== at 0x401C6CA: calloc (vg_replace_malloc.c:279)
==21154== by 0x42B15E3: gdCalloc (gdhelpers.c:79)
==21154== by 0x42A4F49: gdImageCreate (gd.c:104)
==21154== by 0x40BFEA9: msImageCreateWithPaletteGD (mapgd.c:3460)
==21154== by 0x40C04E8: msSaveImageBufferGD (mapgd.c:3695)
==21154== by 0x40CCD6B: msSaveImageBufferAGG (mapagg.cpp:2248)
==21154== by 0x40A70F8: msSaveImageBuffer (maputil.c:682)
==21154== by 0x406CB6C:
Java_edu_umn_gis_mapscript_mapscriptJNI_imageObj_1getBytes
(mapscript_wrap.c:2586)
==21154== by 0x88614AA: ???
==21154== by 0x885BA63: ???
==21154== by 0x885BA63: ???
==21154== by 0x8859218: ???
==21154==
==21154==
==21154== 271,588 (7,268 direct, 264,320 indirect) bytes in 1 blocks are
definitely lost in loss record 49 of 55
==21154== at 0x401D38B: malloc (vg_replace_malloc.c:149)
==21154== by 0x42B15AC: gdMalloc (gdhelpers.c:85)
==21154== by 0x42A4EA4: gdImageCreate (gd.c:83)
==21154== by 0x40BFEA9: msImageCreateWithPaletteGD (mapgd.c:3460)
==21154== by 0x40C04E8: msSaveImageBufferGD (mapgd.c:3695)
==21154== by 0x40CCD6B: msSaveImageBufferAGG (mapagg.cpp:2248)
==21154== by 0x40A70F8: msSaveImageBuffer (maputil.c:682)
==21154== by 0x406CB6C:
Java_edu_umn_gis_mapscript_mapscriptJNI_imageObj_1getBytes
(mapscript_wrap.c:2586)
==21154== by 0x88614AA: ???
==21154== by 0x885BA63: ???
==21154== by 0x885BA63: ???
==21154== by 0x8859218: ???
--- end ---
The amount reported matches up quite nicely with the amount that I'm
observing, so I'm inclined to believe the valgrind report:
(+ 271588 41600)
313188
While the memory is indeed being allocated outside of mapserver code (this
is
with gd 2.0.35):
(gd.c:104)
im->pixels[i] = (unsigned char *) gdCalloc (sx, sizeof (unsigned
char));
(gd.c:83)
im = (gdImage *) gdMalloc (sizeof (gdImage));
the function gdImageCreate() returns a gdImagePrt:
BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy)
{
// ...
gdImagePtr im;
// ...
return im;
}
to mapserver:
(mapgd.c:3460)
img = gdImageCreate(sx, sy);
and I would assume that it is the responsibility of mapserver to free the
memory. (Do you agree?)
Esp. since this happens to me for both test cases of different requests, I
suspect that I could create a synthetic test case independent of my postgis
data to create this, but I haven't yet done so.
I will investigate this further, I just wanted to post this update here.
- Rich
--
View this message in context: http://www.nabble.com/thread-safety-tp15514019p15621043.html
Sent from the Mapserver - User mailing list archive at Nabble.com.
More information about the MapServer-users
mailing list