Я работаю с тестами транспортира и недавно столкнулся с проблемой, связанной с памятью - javascript куча нехватки памяти. Я попытался увеличить кучу памяти с помощью --max-old-space-size=8096
, но хотя один экземпляр узла имеет ~ 8 ГБ памяти, он все еще может достичь этого предела и обработать sh. Я реализовал какой-то трекер памяти и поместил
console.log('login memory data', ` ${heap} MB ${'\t'}| ${diffHeap} MB ${'\t'}`)
и
console.log('logout memory data', ` ${heap} MB ${'\t'}| ${diffHeap} MB ${'\t'}`)
в свой класс входа / выхода из системы (который используется в каждом тесте); это дало мне очень интересные результаты:
данные логина и памяти 2369,92 МБ | 0,00 МБ
при входе в систему и
выход из памяти данных 2492,42 МБ | 122.50 МБ
при выходе из системы
последние данные (проверка перед извлечением кучи javascript из памяти) "съели" огромный объем памяти:
выход из памяти данных 4706,79 МБ | 1608,02 МБ
, а затем сообщение:
2020-02-05T14:21:13.6777685Z [chrome #01] FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
2020-02-05T14:21:13.6777832Z [chrome #01] 1: 00007FF6981DF04A v8::internal::GCIdleTimeHandler::GCIdleTimeHandler+5114
2020-02-05T14:21:13.6777974Z [chrome #01] 2: 00007FF6981BA0C6 node::MakeCallback+4518
2020-02-05T14:21:13.6778090Z [chrome #01] 3: 00007FF6981BAA30 node_module_register+2032
2020-02-05T14:21:13.6778211Z [chrome #01] 4: 00007FF6984420EE v8::internal::FatalProcessOutOfMemory+846
2020-02-05T14:21:13.6778349Z [chrome #01] 5: 00007FF69844201F v8::internal::FatalProcessOutOfMemory+639
2020-02-05T14:21:13.6778558Z [chrome #01] 6: 00007FF698962BC4 v8::internal::Heap::MaxHeapGrowingFactor+9556
2020-02-05T14:21:13.6778688Z [chrome #01] 7: 00007FF698959C46 v8::internal::ScavengeJob::operator=+24310
2020-02-05T14:21:13.6778826Z [chrome #01] 8: 00007FF69895829C v8::internal::ScavengeJob::operator=+17740
2020-02-05T14:21:13.6778951Z [chrome #01] 9: 00007FF69895E1B7 v8::internal::Heap::CreateFillerObjectAt+1175
2020-02-05T14:21:13.6779142Z [chrome #01] 10: 00007FF6987EC5B3 v8::internal::interpreter::Interpreter::GetDispatchCountersObject+78451
2020-02-05T14:21:13.6779294Z [chrome #01] 11: 00007FF698141132 v8::internal::StackGuard::ArchiveSpacePerThread+52082
2020-02-05T14:21:13.6779428Z [chrome #01] 12: 00007FF6981417F3 v8::internal::StackGuard::ArchiveSpacePerThread+53811
2020-02-05T14:21:13.6779624Z [chrome #01] 13: 00007FF698221474 uv_dlerror+2436
2020-02-05T14:21:13.6779757Z [chrome #01] 14: 00007FF6982221D8 uv_run+232
2020-02-05T14:21:13.6779869Z [chrome #01] 15: 00007FF6981C128E node::NewContext+1390
2020-02-05T14:21:13.6779994Z [chrome #01] 16: 00007FF6981C189B node::NewIsolate+603
2020-02-05T14:21:13.6780105Z [chrome #01] 17: 00007FF6981C1D07 node::Start+839
2020-02-05T14:21:13.6780243Z [chrome #01] 18: 00007FF69807935C node::MultiIsolatePlatform::MultiIsolatePlatform+604
2020-02-05T14:21:13.6780377Z [chrome #01] 19: 00007FF698C1A93C v8::internal::compiler::OperationTyper::ToBoolean+134796
2020-02-05T14:21:13.6780506Z [chrome #01] 20: 00007FFC34C484D4 BaseThreadInitThunk+20
2020-02-05T14:21:13.6780635Z [chrome #01] 21: 00007FFC35F4E8B1 RtlUserThreadStart+33
Это привело меня к выводу, что между каждой спецификацией c память не освобождается. Я запускаю эти тесты в двух средах, а во второй тесты проходят, однако транспортир по-прежнему использует для них много (~ 2,5 ГБ) памяти.
Каковы возможные причины такого большого потребления памяти? Могу добавить, что тест в значительной степени основан на browser.wait
Вот мой конф. js file
var HtmlReporter = require('protractor-beautiful-reporter');
var SpecReporter = require('jasmine-spec-reporter').SpecReporter;
var jasmineReporters = require('jasmine-reporters');
var browserToken = '#{browser}#';
var _browserName = browserToken.replace(/\W/g, '') === 'browser' ? 'chrome' : browserToken;
exports.config = {
params: {
// config stuff
},
directConnect: true,
onPrepare: function() {
browser.params.url = `${browser.params.protocol}://${browser.params.address}`;
jasmine.getEnv().addReporter(new HtmlReporter({
// config stuff
}).getJasmine2Reporter());
jasmine.getEnv().addReporter(new SpecReporter({
spec: {
displayStacktrace: true
}
}));
return browser.getProcessedConfig().then(function(config) {
var browserName = config.capabilities.browserName;
var junitReporter = new jasmineReporters.JUnitXmlReporter({{
`${generatedSuiteName}.${browser.params.environmentName}.${browserName}`;
}
});
jasmine.getEnv().addReporter(junitReporter);
});
},
onComplete: function(){
browser.driver.close().then(function(){
browser.driver.quit();
});
},
multiCapabilities: [
{
'browserName': _browserName,
chromeOptions: {
args: ["--window-size=3840,2160", "--ignore-certificate-errors", "--ignore-ssl-errors", "--headless"]
},
specs: [
],
},
{
'browserName': _browserName,
chromeOptions: {
args: ["--window-size=3840,2160", "--ignore-certificate-errors", "--ignore-ssl-errors", "--headless", "--disable-gpu", "--no-sandbox" ]
},
specs: [
],
},
{
'browserName': _browserName,
chromeOptions: {
args: ["--window-size=3840,2160", "--ignore-certificate-errors", "--ignore-ssl-errors", "--headless"]
},
specs: [
],
},
],
}
};```