如何释放V8所占用的内存
How to free up the memory claimed by V8?
我正在开发的一个应用程序嵌入了V8脚本。为了节省内存,我想在不需要脚本组件时关闭它,但由于某种原因,内存永远不会返回给操作系统。
这是我尝试的:
1。对持久上下文句柄
调用Dispose()context.Dispose();
2。强制垃圾回收
while (!v8::V8::IdleNotification());
这些对进程的内存使用没有任何显著的影响。我可以清楚地看到,当一个脚本请求内存时,它是如何上升的,但它再也不会下降了。
我正在确定ps -o rss
的进程内存使用情况。我知道,如果没有分析器,要计算出进程使用了多少内存是不可能的,但我确实认为,当V8释放内存时,rss应该下降。
操作系统可能只是没有回收内存(例如出于性能原因),即使您的应用程序已经正确释放了内存。应用程序堆也可能持有内存,以防您很快再次需要它。无论哪种方式,如果您确定您没有泄漏(尝试像valgrind这样的东西),我都不会担心它。
我花了几个小时来解决这个问题,最终不得不深入研究api。
结果V8引脚全局对象模板的最后一个实例快速重用(无论是原始的ObjectTemplate或派生自代理的FunctionTemplate)。这在尝试强制GC刷新时非常令人困惑。解决方法是分配新的虚拟上下文(使用与您试图清除的上下文相同的模板)。
static void do_gc()
{
{
Isolate *i = Isolate::GetCurrent();
HandleScope h(i);
Handle<Context> c = Context::New(i); // Default contexes
Handle<Context> c = Context::New(i, 0, objtemplate); // With custom object
Handle<Context> c = Context::New(i, 0, fntemplate->InstanceTemplate()); // With proxy
}
while (!v8::V8::IdleNotification());
}
查看上下文用法https://github.com/katlogic/lv8/blob/344353dac702901c917a4c05438252121c527ab3/lv8.cpp#L755
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 为什么在 v8 中运行嵌入在 c++ 中的非常简单的脚本会占用内存?
- 谷歌v8内存泄漏执行的代码
- 如何判断v8隔离实例使用了太多内存
- 如何释放V8所占用的内存
- 参数返回值的 V8 内存管理