|
微软研究部项目Snowflake将手动记忆管理和垃圾回收整合在一起,为开发商提供“两个世界最好的”Microsoft在.Net中探索“安全”手动内存管理
监控软件
Microsoft Research一直在.Net运行时集成安全的手动内存管理与垃圾收集(GC)。目标是为开发人员提供自动内存管理的便利性和安全性,并通过手动释放内存来提高性能的机会。
这项称为Project Snowflake的工作是本周由微软研究院和剑桥大学和普林斯顿大学的合着者发表的论文的主题。使用Snowflake,程序员可以在GC堆或手动堆中分配对象之间进行选择。 Snowflake将开源.Net运行时与手动管理内存的功能结合在一起,而不会影响性能或安全性。
现有应用程序使用GC堆未修改运行,而不会降低性能。
研究人员说:“我们的.Net CoreCLR实现在实际应用中的实验结果显示出显着的性能提升,特别是在多线程情况下:峰值工作组节省3倍,运行时间提高2倍。
Microsoft的手动内存管理模型基于手动对象的唯一所有者的概念,堆栈或堆中的位置仅包含对分配在手动堆上的对象的引用。引入屏蔽的概念,以实现手动对象​​的安全并发共享。屏蔽在本地线程存储中创建状态,以防止在使用对象时进行解除分配。
研究人员说,尽管垃圾收集器(如.Net GC)通过快速线程局部碰撞分配和年轻物体的收集来提供高吞吐量,但研究表明,与手动内存管理相比,GC可以引入性能开销。他们解释说,这些开销在大数据分析和实时流处理应用中被放大,部分原因是需要追踪大堆。
研究人员指出,“随着现代服务器利用更大的记忆,这种趋势可能会持续下去,数千吉字节甚至几兆字节的大小已经很普遍了。手动内存管理通过避免跟踪对象图来释放对象来解决问题,并允许程序员使用自己的对象生命周期知识来释放对象在程序中的特定位置。根据研究人员的说法,这提高了吞吐量和内存使用率。但手动内存管理“通常不安全”,可能导致崩溃和漏洞。它也取消了GC的生产效益。
Project Snowflake在Microsoft的开源.NET实现(称为.Net Core)中修改CoreCLR运行时,并使用手动内存的API扩展了标准库。灵活的编程模型被用于手动存储器管理,允许在任意程序位置分配和释放对象,并且在多个线程之间并发和安全地共享对象。
微软的设计不会对垃圾收集或写入障碍等操作造成任何开销。要优化应用程序的程序员必须逐步更改代码以在手动堆中分配对象并显式地释放它们。手动管理的对象保证完整的类型和时间安全性,包括在并发访问的情况下。根据报告,开发人员可以获得动态受管理的异常情况,但不会出现任何崩溃或安全​​漏洞。
|
|