Я где-то читал, что если wasm модуль имеет процесс, для которого нужно аллоцировать памяти для wasm-а, то память, задействованная этим процессом не вернёться обратно на нужды браузера или операционки. В wasm-е есть возможность этим управлять? Или единственным способом будет отделять такой жрущий память процесс в отдельный модуль, а потом этот модуль удалять в runtime-е?
#[wasm_bindgen(start)]
pub fn js_main() -> Result<(), JsValue> {
let window: web_sys::Window = web_sys::window().unwrap();
let document: web_sys::Document = window.document().unwrap();
let canvas: web_sys::Element = document.get_element_by_id("canvas").unwrap();
console::log(&vec![&canvas, &200, &"Some text"]);
webgl_context_obtain(&canvas);
let mut a: Vec<i64> = [0; 29999999].to_vec();
let mut i = 0i64; loop {
a[i as usize] = i;
i += 1;
if i as usize == a.len() {break}
}
// for val in a {
console::log(&vec![&"ok"]);
// }
Ok(())
}
После завершения программы:
(В консоли "ok")
После закрытия вкладки:
Я так же вынес создание и наполнение вектора в другую функцию, и вызвал эту функцию в главной. Тоже самое потребление
Так же проверил что будет если убрать операцию создания и наполнения вектора совсем, чтобы проверит не жрёт ли случайно wasm сам по себе ~350мб. Нет. Без нагрузки на память вкладка потребляет 50мб. УЖАС ВАЗМ НЕ ОПТИМИЗИРОВАН. Хотя не факт что всё так плохо, возможно память очищается когда совсем уж неадекватные потребления. Или просто приложение крашиться и память забирается... Афигенная спецификация у вазма... (Если это вообще вина спецификации)
Заменил
let mut a: Vec<i64> = [0; 29999999].to_vec();
на
let mut a: Vec<i64> = [0; 49999999].to_vec();
и всё крашнулось к чертям (браузер остановился, все приложения в фоне перезапустились). Браузер не возвращает память при острой необходимости, потому что прошлая попытка была близка к критическому потреблению, можно было бы тогда и отдать гигабайт памяти какой