hello-world.cc 样本似乎泄漏了内存
hello-world.cc sample seems to leak memory
刚开始尝试在 C++ 项目中嵌入 V8。鉴于这个库的复杂性,我认为如果我可以使用 valgrind 作为一个额外的回归测试器,它会不那么可怕。希望定期检查来自 valgrind 的干净 运行 至少有助于在我走得太远之前捕获某些类型的错误。
不幸的是,似乎开箱即用 hello-world.cc 样本泄漏了一些 kB 的内存。从示例中剥离内容,即使只是创建和删除一个 Isolate 也不会给我一个干净的 运行.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libplatform/libplatform.h"
#include "v8.h"
int main(int argc, char* argv[]) {
// Initialize V8.
v8::V8::InitializeICUDefaultLocation(argv[0]);
v8::V8::InitializeExternalStartupData(argv[0]);
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
// Create a new Isolate and make it the current one.
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
// Dispose the isolate and tear down V8.
isolate->Dispose();
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete create_params.array_buffer_allocator;
return 0;
}
我看到这已经被其他人注意到了:https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0
我想我的问题是:是否值得尝试使用 v8 实现无泄漏,或者库是否可能总是会在 breeze 中留下一些位和字节,就像现在一样通常是复杂库的情况?或者,如果我(和其他人)在 hello-world 示例中做错了什么,那将很有用。
这里是 V8 开发人员。我很确定 V8 是 LSan (LeakSanitizer) 干净的。我们不再定期使用 Valgrind 进行测试(主要是因为它太慢了)。
在 Valgrind 中使用 v8_hello_world
二进制文件进行的快速测试中,我确实看到了两个泄漏报告。其中之一看起来是故意的:它在 LSan 和 "not really a leak" 中被明确忽略,因为内存旨在跨 Isolates 共享,因此不允许任何 Isolate 在拆卸时释放它。您可以尝试在进程退出时释放它,但这不会带来切实的好处,它只会安抚消毒剂,并且会花费工程和 CPU/execution 努力来实现这一目标。我不完全确定另一份报告,但我怀疑它是相关的。
长话短说:
- Valgrind 可能缺少(非常短的)故意 "leaks"(无论出于何种原因真实或误检测)允许列表
- V8 不应该泄漏内存;如果是这样,那就是一个错误
- 我们主要关心长期 运行 Isolates 是否无泄漏,而不太关心单个进程创建和销毁数百万 Isolates 是否无泄漏。我确实认为这也应该有效,但实际上,如果每个隔离物都有少量固定泄漏,那么修复它可能不那么紧迫。
this has already been noted by others: https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0
如果我没看错那个线程,它明确地关注有人观察到的内存消耗,但 Valgrind 没有 报告为泄漏。
刚开始尝试在 C++ 项目中嵌入 V8。鉴于这个库的复杂性,我认为如果我可以使用 valgrind 作为一个额外的回归测试器,它会不那么可怕。希望定期检查来自 valgrind 的干净 运行 至少有助于在我走得太远之前捕获某些类型的错误。
不幸的是,似乎开箱即用 hello-world.cc 样本泄漏了一些 kB 的内存。从示例中剥离内容,即使只是创建和删除一个 Isolate 也不会给我一个干净的 运行.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libplatform/libplatform.h"
#include "v8.h"
int main(int argc, char* argv[]) {
// Initialize V8.
v8::V8::InitializeICUDefaultLocation(argv[0]);
v8::V8::InitializeExternalStartupData(argv[0]);
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
// Create a new Isolate and make it the current one.
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
// Dispose the isolate and tear down V8.
isolate->Dispose();
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete create_params.array_buffer_allocator;
return 0;
}
我看到这已经被其他人注意到了:https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0
我想我的问题是:是否值得尝试使用 v8 实现无泄漏,或者库是否可能总是会在 breeze 中留下一些位和字节,就像现在一样通常是复杂库的情况?或者,如果我(和其他人)在 hello-world 示例中做错了什么,那将很有用。
这里是 V8 开发人员。我很确定 V8 是 LSan (LeakSanitizer) 干净的。我们不再定期使用 Valgrind 进行测试(主要是因为它太慢了)。
在 Valgrind 中使用 v8_hello_world
二进制文件进行的快速测试中,我确实看到了两个泄漏报告。其中之一看起来是故意的:它在 LSan 和 "not really a leak" 中被明确忽略,因为内存旨在跨 Isolates 共享,因此不允许任何 Isolate 在拆卸时释放它。您可以尝试在进程退出时释放它,但这不会带来切实的好处,它只会安抚消毒剂,并且会花费工程和 CPU/execution 努力来实现这一目标。我不完全确定另一份报告,但我怀疑它是相关的。
长话短说:
- Valgrind 可能缺少(非常短的)故意 "leaks"(无论出于何种原因真实或误检测)允许列表
- V8 不应该泄漏内存;如果是这样,那就是一个错误
- 我们主要关心长期 运行 Isolates 是否无泄漏,而不太关心单个进程创建和销毁数百万 Isolates 是否无泄漏。我确实认为这也应该有效,但实际上,如果每个隔离物都有少量固定泄漏,那么修复它可能不那么紧迫。
this has already been noted by others: https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0
如果我没看错那个线程,它明确地关注有人观察到的内存消耗,但 Valgrind 没有 报告为泄漏。