Trame2771
@Trame2771

Правда ли что wasm при пиковой нагрузке отожрав память, после спада нагрузки её не возвращает?

Я где-то читал, что если 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")
6521f28f69ad3772505845.jpeg

После закрытия вкладки:
6521ed6d7a124499103362.jpeg

Я так же вынес создание и наполнение вектора в другую функцию, и вызвал эту функцию в главной. Тоже самое потребление

Так же проверил что будет если убрать операцию создания и наполнения вектора совсем, чтобы проверит не жрёт ли случайно wasm сам по себе ~350мб. Нет. Без нагрузки на память вкладка потребляет 50мб. УЖАС ВАЗМ НЕ ОПТИМИЗИРОВАН. Хотя не факт что всё так плохо, возможно память очищается когда совсем уж неадекватные потребления. Или просто приложение крашиться и память забирается... Афигенная спецификация у вазма... (Если это вообще вина спецификации)

Заменил
let mut a: Vec<i64> = [0; 29999999].to_vec();
на
let mut a: Vec<i64> = [0; 49999999].to_vec();
и всё крашнулось к чертям (браузер остановился, все приложения в фоне перезапустились). Браузер не возвращает память при острой необходимости, потому что прошлая попытка была близка к критическому потреблению, можно было бы тогда и отдать гигабайт памяти какой
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы