denoland / deno_bindgen

Write high-level Deno FFI libraries in Rust.
MIT License
274 stars 28 forks source link

memery leak for deno_bindgen #108

Closed usrtax closed 10 months ago

usrtax commented 1 year ago

deno 1.26.0 (release, x86_64-unknown-linux-gnu) v8 10.7.193.3 typescript 4.8.3

code is there https://github.com/usrtax/deno_bindgen_test

use deno_bindgen::deno_bindgen;

#[deno_bindgen]
fn add3() -> &'static [u8] {
    &[
        1, 2, 3, 4, 5, 6, 7, 9, 0, 1, 2, 3, 4, 5, 6, 7, 9, 0, 1, 2, 3, 4, 5, 6, 7, 9, 0, 1, 2, 3,
    ]
}

test code https://github.com/usrtax/deno_bindgen_test/blob/main/lib/test.js

#!/usr/bin/env -S node --es-module-specifier-resolution=node --trace-uncaught --expose-gc --unhandled-rejections=strict
var main, n, sleep;

import {
  add3
} from '../bindings/bindings.ts';

sleep = () => {
  return new Promise((resolve) => {
    return setTimeout(resolve, 10);
  });
};

n = 0;

while (true) {
  main();
  if (n++ % 10000 === 0) {
    gc();
    await sleep();
    console.log(n, Deno.memoryUsage());
  }
}

run as begin

image

run 3mintues RES 1040M

image

run 10minutes RES 2177M

run 1hour RES 14.9G

image

Deno.memoryUsage doesn't seem to be very accurate, pay more attention to the memory usage in top

ar37-rs commented 1 year ago

You are doing 'static stuff, any 'static stuff including &'static [u8] won't be dropped or freed until the application successfully exited.

usrtax commented 1 year ago

I change code into

#[deno_bindgen]
fn add3(a: u64, b: u64) -> u64 {
    a + b
}

memery still leak

1 mintues

image

2 mintues

image
littledivy commented 1 year ago

Thanks for the report. This is a known issue, deno_bindgen leaks the buffer to JS land. The JS bindings should register a finalization callback to free the buffer.