一种将垃圾回收编程语言高效引入WebAssembly的新方法
最近一篇关于WebAssembly垃圾回收(WasmGC)的文章从高层次解释了垃圾回收(GC)提案旨在更好地支持在Wasm中流行的垃圾回收语言的重要性。在本文中,我们将深入探讨诸如Java、Kotlin、Dart、Python和C#等垃圾回收语言如何移植到Wasm中。其实有两种主要的方法:
最近一篇关于WebAssembly垃圾回收(WasmGC)的文章从高层次解释了垃圾回收(GC)提案旨在更好地支持在Wasm中流行的垃圾回收语言的重要性。在本文中,我们将深入探讨诸如Java、Kotlin、Dart、Python和C#等垃圾回收语言如何移植到Wasm中。其实有两种主要的方法:
控制流完整性(CFI)是一项旨在防止利用漏洞劫持控制流的安全功能。其理念即使攻击者成功破坏了一个进程的内存,通过额外的完整性检查也可以阻止他们执行任意代码。在这篇博客中,我们将讨论在V8中启用CFI的相关工作。
这篇博客文章由 José Dapena Paz (Igalia) 撰写,并得到了 Jason Williams (Bloomberg)、Ashley Claymore (Bloomberg)、Rob Palmer (Bloomberg)、Joyee Cheung (Igalia) 和 Shu-yu Guo (Google) 的贡献。
在这篇关于 V8 堆快照的文章中,我将谈谈由 Bloomberg 工程师发现的一些性能问题,以及我们如何解决这些问题,使 JavaScript 内存分析比以往更快。
Bloomberg 的工程师正在诊断一个 JavaScript 应用中的内存泄漏问题。应用程序由于 内存不足 错误而失败。对于测试的应用程序,V8 的堆限制配置约为 1400 MB。一般情况下,V8 的垃圾收集器应该能够将堆使用保持在该限制以下,因此这些错误表明可能存在泄漏。
我们在V8 v11.2中推出了WebAssembly尾调用!在本文中,我们将简要介绍该提案,展示一个关于使用Emscripten的C++协程的有趣用例,并说明V8如何在内部处理尾调用。
如果一个调用是当前函数在返回之前执行的最后一个指令,就称其处于尾部位置。编译器可以通过丢弃调用帧并将调用替换为跳转来优化此类调用。
这对递归函数尤其有用。例如,考虑以下用C语言编写的函数,该函数对链表中的元素求和:
int sum(List* list, int acc) {
if (list == nullptr) return acc;
return sum(list->next, acc + list->val);
}
使用常规调用,这会消耗𝒪(n)的堆栈空间:链表中的每个元素都会在调用堆栈中添加一个新的框架。如果列表足够长,这很快会导致堆栈溢出。通过将调用替换为跳转,尾调用优化实际上将此递归函数转化为一个使用𝒪(1)堆栈空间的循环:
当我编译一个使用少于4GB RAM的程序时,却用64位指针,这绝对是愚蠢的。当这样的指针值出现在结构中时,既浪费了一半的内存,也实质上丢掉了一半的缓存。
过去,每个新的V8发布分支都会有一篇博客文章。你可能注意到自v9.9以来就没有发布过版本博客文章。从v10.0开始,我们将不再为每个新分支发布版本博客文章。但是不用担心,你依然可以获得以前通过版本博客文章获取的信息!继续阅读,了解未来在哪里找到这些信息。
注意: 本文最初发布在Google安全博客。
Chrome的内存安全是一个持续不断的努力,以保护我们的用户。我们不断尝试使用不同的技术以超越恶意行为者。在这种精神下,这篇文章介绍了我们使用堆扫描技术来改进C++的内存安全的旅程。
类字段从 v7.2 开始在 V8 中推出,私有类方法从 v8.4 开始推出。随着提案在 2021 年达到第 4 阶段后,V8 开始着手改善对新类特性的支持——在此之前,这些特性应用存在两大主要问题:
虽然此篇文章标题可能暗示深入探讨有关油底壳的书籍集合——这个主题因其设计规范意外地涉及了大量文献——实际上,我们会仔细探讨Oilpan,它是一个通过V8作为库托管的C++垃圾回收器,从V8 v9.4开始。