写点什么

Visual Studio 15 的内存占用探析

  • 2016-10-30
  • 本文字数:1542 字

    阅读完需:约 5 分钟

Jeff Martin 撰写了一系列关于 Visual Studio “15”性能分析的文章。在他的上一篇文章《 Visual Studio “15”的启动优化》中曾提到,微软已承诺全面提升 Visual Studio “15” IDE 的性能。本文将从内存处理的角度,探讨他们在 Technical Preview 5(TP5)中所做的提升:在主程序保留为一个 32 位进程的同时,将部分关键组件迁移到微软独有的进程。

在微软任职的 Ashok Kamath 针对这些改变在《 Visual Studio “15”的内存溢出崩溃减少优化》一文中做了更多的介绍,以便能从更全面的视角来看待这些改变。他提供了一种方法来度量微软开发团队所作出的改进。他提供了 2 个不同的指标:虚拟内存峰值 PVM(Peak Virtual Memory)和个人工作集峰值 PPWS(Peak Private Working Set)。PVM 指的是 VS15 主进程所占用的总内存数。由于主进程是 32 位的,因此它的最大值被限制为 4GB 内存。PPWS 指的是 VS15 的 devenv.exe 和相关进程所占用的物理内存数。

首先被移出 VS15 主进程的是 JavaScript 语言服务。JavaScript 语言服务提供智能提示、代码导航等功能。新的 JavaScript 服务由一个独立的 Node.js 进程协同 VS15 提供对 JavaScript 和 TypeScript 的支持。Kamath 团队通过在 VS 2015 Update 3(Visual Studio 之前的一个版本)和 VS15 Preview 5 中加载 WebSpaDurandal 方案来测量新服务的性能影响。在 VS15 Preview 5 中,PVM 占用量大约减少了 33%,但是 PPWS 的占用量减少得非常少,几乎可以忽略不计。

第二个内存优化的部分是关于调试器中的符号加载。纵观 Visual Studio 的近期发布历史,他们已经通过高侵入性地从 PDB 文件中预加载符号数据来让 C++ 调试器运行地更快。但是这个方案有一个弊端,那就是会消耗大量的内存。在 VS15 中,这个预加载功能被重写。新的预加载功能致力于只加载需要的信息而不是像之前那样“大而全”地加载。为了测量这一改进,Kamath 团队用 VS 2015 Update 3 和 VS15 Preview 5 打开 Unreal Engine 方案,并使用调试器调试 Unreal Engine 进程。结果,VS 2015 Update 3 不能执行这个操作,因为它会因为内存溢出错误而崩溃;TP5 可以执行这个操作,占用大约 3GB PVM 和大约 1.8GB PPWS。

第三个被移出主进程的是关于 Git 的组件。Visual Studio 的先前版本使用 libgit2 库,但是在 TP5 中改用 git.exe。通过使用 Chromium 包测量这个改进,发现在 TP5 中 VS 主进程占用了 0GB PVM,而 VS2015 占用了大约 300B PVM。至于 PPWS 的占用量,两者大致相当。

尽管测量工具已经提供了一些内存占用量减少的证据,但是开发者们获知这一消息后,针对微软采用的一些方案提出了许多问题。首先提到的是,更频繁的内存交换可能导致可用性下降。另外,一位名为“Syka”的评论者提出,尽管从主进程中移出部分组件会解除内存占用方面的限制,但是可能会造成潜在的性能下降。因为跨进程的进程通信相对于原来的进程内部的组件调用来说,会造成更高的通信成本。此外,一些评论者提到,Visual Studio 的真实问题并不是内存占用,而是由于主进程是 32 位而导致的寻址空间的稀缺。为此,他们再次呼吁微软能够开发 64 位版本的 Visual Studio(详情可参考《让VS 扩展支持64 位》)。

作者简介

Jeff Martin 拥有密歇根大学的 MBA 学位,曾在金融领域有所建树,但是为了紧随时代潮流,毅然投身计算机产业。他在业余时间喜欢和妻子一起旅行,阅读和编程。他刚著作了一本新书,《Visual Studio 2013 Cookbook》。可以在 Twitter 上关注他, http://twitter.com/jeffemartin

查看英文原文 Addressing Visual Studio 15’s Memory Usage


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-10-30 19:002496

评论

发布
暂无评论
发现更多内容

Cloudreve 自建云盘实践,我说了没人能限得了我的容量和速度!

小傅哥

Java 小傅哥 Cloudreve 自建云盘

划重点丨详解Java流程控制语句知识点

华为云开发者联盟

Java 流程控制语句

SumSwap在市场上的强大突破是否会成为DEX领域最大的黑马?

币圈资讯

2D+1D | vivo官网Web 3D应用开发与实战

vivo互联网技术

大前端 WebGL 3D数据可视化 Draco 3D

智慧公安情报综合研判平台开发,助推公安信息化发展

13828808769

智慧城市

Android中的图像格式

如浴春风

android 音视频 安卓 签约计划

Spark原理与实战之部署模式与运行机制

小舰

spark Spark调优 4月日更

浪潮签约“数字基建”合作伙伴共促工业互联网创新发展

工业互联网

MySQL多表查询详解

若尘

MySQL 查询

华为帐号服务学习笔记(三):10分钟完成Authorization Code模式客户端Demo开发

Coding狙击

android HMS

亿网嘉元是做什么的?

飞亚科技

WebRTC基础知识详解

IT酷盖

签约计划

AI数学基础之:确定图灵机和非确定图灵机

程序那些事

人工智能 AI 程序那些事 图灵机

数据分析与数据增长核心逻辑杂谈

小飞象@木木自由

数据分析

公有云成本节省神器!京东云共享带宽包正式上线

京东科技开发者

公有云 带宽

最详细的基于 Prometheus 的 Azure 指标监控

耳东@Erdong

azure Prometheus 4月日更

模块二作业

c

架构实战营

更简的并发代码,更强的并发控制

万俊峰Kevin

并发 go-zero Go 语言

「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之业务数据增删改查(七)

crudapi

Vue API crud crudapi quasar

线上服务 CPU 100% ?一键定位 so easy!

Java小咖秀

性能 cpu 服务器 负载 紧急问题

创建索引,这些知识应该了解

Simon

MySQL 索引

云小课 | 不了解EIP带宽计费规则?看这里!

华为云开发者联盟

带宽 弹性公网IP 带宽变更 计费模式

「 优秀主题征文名单公布 」—— InfoQ 写作平台【 1 周年盛典 】

InfoQ写作社区官方

1 周年盛典 热门活动

「 最佳内容公布」—— InfoQ 写作平台【 1 周年盛典 】

InfoQ写作社区官方

1 周年盛典 热门活动

一文带你剖析LiteOS互斥锁Mutex源代码

华为云开发者联盟

mutex LiteOS 互斥锁 互斥锁结构体

对前端趋势的一些理解

葱小白

大前端

从石器时代到田园牧歌:如何对 API 统一建模

李宇飞

API

Python变量作用域与LEGB规则

大奎

语法 Python Monad 作用域

派出所重点人员管控系统开发,建设智慧警务

13828808769

智慧组工

区块链电子合同技术方案,区块链电子合同存证

13828808769

区块链 区块链+

Linux rmdir 命令

一个大红包

linux命令 4月日更

Visual Studio 15的内存占用探析_.NET_Jeff Martin_InfoQ精选文章