转:关于浏览器内存的思考
在论坛里面混了好久了,突然发现一篇主题都没发表过,都只是回帖,于是决定贡献一点力量。
最近看论坛,发现很多用户都在关注内存问题,不少用户觉得内存占用比较大,就这个问题,我想以个人观点发表一些看法,当然也希望大家看完我的文字之后,对内存这个东西有个新的理解和看法。
先讲点基本的科普知识,以windows为例,操作系统里面运行着很多进程,每个进程都需要消耗一定的内存用来存放自己的数据,浏览器也不例外。但是内存总数是固定的,那么一旦进程所需要的总内存超出机器安装的物理内存怎么办呢?操作系统很聪明,它会把一些不常用的内存放到硬盘上(想了解更多细节的,可以去搜一下LRU算法),这样可以把内存腾出来给那些处于活动状态的程序。当那些当初被临时放到硬盘的内存数据需要再次被使用时,操作系统会把它们取出来,重新放到内存中去。这个过程就是我们常说的“换页(page swap)”操作。换页操作是有很大的额外开销的,毕竟硬盘速度比内存要慢很多。
那么我们平常在任务管理器所看到的“内存”是什么呢?其实那个数值的含义是“一个进程真实消耗的内存大小 减去 被转移到硬盘上的内存大小”,你可以简单理解为“假的内存占用”。也就是说,这个数字越小并不能说明一个软件越省内存,有可能是这个软件在“搞鬼”:它把自己的内存“强制”放到硬盘上(windows有一个api叫SetProcessWorkingSetSize,可以强制把内存放到硬盘上)。这里推荐大家关注一个叫Private Bytes的指标,这个指标才能真正反映一个进程所消耗的内存数。注意,xp下面的任务管理器是无法看到这个指标的,大家可以去下载process explorer,就能看到了。
上面说的可能太深奥,下面我们说点简单的,就说浏览器占内存这个事情吧。论坛上不少朋友都说浏览器占内存大,说什么开了5个页面就占了200M之类的话。那么你也许一直关注的就是我上面说的那个“假”的内存,如果有可能,不妨关注一下private bytes。比如对比一下傲游或者tw,甚至是ie也可以,开同样的标签,做同样的动作,看看大家的private bytes是否一样。当然,我举这个例子,显然他们的private bytes应该是相差无几(差个几M不是关键问题)。此时你可以再关注一下“假”内存,如果有某个浏览器的这个“假”内存数字很小,说明这个浏览器在“有意掩饰”一些东西,当然出于什么目的我们就不知道了。
有些朋友可能会担心,说浏览器会不会把整个操作系统的内存全吃满。我可以放心地告诉你,操作系统的设计绝对比你想的要聪明得多。假设你有512M的内存,但是你开了很多网页,这些网页要消耗1G的内存。此时操作系统会自动把多出的那些内存转移到硬盘,而且在一般情况下,操作系统会很聪明地选择那些你长时间没有阅读的页面(因为采用多标签,所以一般只能看到一个页面)放入硬盘。这个时候,你通过任务管理器就会看到,这个浏览器也许只占用了300M的内存,但是其实它有700M的内存被临时放到了硬盘上。但是如果你用process explorer,就会看到,这个软件的private byte是1G,不会随着窗口的显示和隐藏而发生改变。
从操作系统的设计角度来看,数据在内存和硬盘之间的转移应该属于操作系统的职责,一个进程不应当越俎代庖。如果纯为了任务管理器好看,纯为了一些无聊的内存评测,那么我们完全可以把内存全都塞到硬盘上,你甚至可以看到浏览器只占1M的内存,但是这样用起来就会特别卡,因为每次需要访问数据时,都要从硬盘中现取,那速度自然可想而知了。有些朋友可能担心,说我开着浏览器的时候还要做别的事情,不能让浏览器把内存都吃掉,那么从这个角度考虑,就更应该把内存的管理权交给操作系统了,因为只有操作系统才知道你这个时候在做什么,操作系统会根据你当前的行为来决定内存的分配策略。而相反地,搜狗浏览器的开发人员并不知道你会做什么,极端一点说,如果搜狗浏览器强制“不许”把内存放到硬盘,那么有些用户就会说“搜狗浏览器好流畅啊,真爽”,但是另外一些用户就会说“搜狗真烂,一开搜狗,其他软件都巨卡”;相反地,如果搜狗浏览器强制把所有内存都放到硬盘,那么一些用户就会说“搜狗真省内存,一点也不影响其他软件运行”,但是另外一些用户就会说“搜狗太他妈卡了,根本没法用”。
我个人的观点是,搜狗以后可以推出多种模式供大家选择,比如有些用户喜欢关注“假”内存这个数字,那么就可以把内存全部交换到硬盘,以满足这些用户的一些癖好;而对于大多数普通用户,目前这样子应该说是最佳的状态(即把内存的管理权完全交给操作系统掌管)。
最后请各位喷子注意,我的观点仅供大家参考,但是如果你想在原理上————注意是“原理”上————喷我,那么我建议你先做一些功课再来喷,比如学学基本的操作系统原理,读读linux kernel源码,改改wrk什么的,以免你的水平比我低太多。
欢迎大家深入交流!
以上!
最近看论坛,发现很多用户都在关注内存问题,不少用户觉得内存占用比较大,就这个问题,我想以个人观点发表一些看法,当然也希望大家看完我的文字之后,对内存这个东西有个新的理解和看法。
先讲点基本的科普知识,以windows为例,操作系统里面运行着很多进程,每个进程都需要消耗一定的内存用来存放自己的数据,浏览器也不例外。但是内存总数是固定的,那么一旦进程所需要的总内存超出机器安装的物理内存怎么办呢?操作系统很聪明,它会把一些不常用的内存放到硬盘上(想了解更多细节的,可以去搜一下LRU算法),这样可以把内存腾出来给那些处于活动状态的程序。当那些当初被临时放到硬盘的内存数据需要再次被使用时,操作系统会把它们取出来,重新放到内存中去。这个过程就是我们常说的“换页(page swap)”操作。换页操作是有很大的额外开销的,毕竟硬盘速度比内存要慢很多。
那么我们平常在任务管理器所看到的“内存”是什么呢?其实那个数值的含义是“一个进程真实消耗的内存大小 减去 被转移到硬盘上的内存大小”,你可以简单理解为“假的内存占用”。也就是说,这个数字越小并不能说明一个软件越省内存,有可能是这个软件在“搞鬼”:它把自己的内存“强制”放到硬盘上(windows有一个api叫SetProcessWorkingSetSize,可以强制把内存放到硬盘上)。这里推荐大家关注一个叫Private Bytes的指标,这个指标才能真正反映一个进程所消耗的内存数。注意,xp下面的任务管理器是无法看到这个指标的,大家可以去下载process explorer,就能看到了。
上面说的可能太深奥,下面我们说点简单的,就说浏览器占内存这个事情吧。论坛上不少朋友都说浏览器占内存大,说什么开了5个页面就占了200M之类的话。那么你也许一直关注的就是我上面说的那个“假”的内存,如果有可能,不妨关注一下private bytes。比如对比一下傲游或者tw,甚至是ie也可以,开同样的标签,做同样的动作,看看大家的private bytes是否一样。当然,我举这个例子,显然他们的private bytes应该是相差无几(差个几M不是关键问题)。此时你可以再关注一下“假”内存,如果有某个浏览器的这个“假”内存数字很小,说明这个浏览器在“有意掩饰”一些东西,当然出于什么目的我们就不知道了。
有些朋友可能会担心,说浏览器会不会把整个操作系统的内存全吃满。我可以放心地告诉你,操作系统的设计绝对比你想的要聪明得多。假设你有512M的内存,但是你开了很多网页,这些网页要消耗1G的内存。此时操作系统会自动把多出的那些内存转移到硬盘,而且在一般情况下,操作系统会很聪明地选择那些你长时间没有阅读的页面(因为采用多标签,所以一般只能看到一个页面)放入硬盘。这个时候,你通过任务管理器就会看到,这个浏览器也许只占用了300M的内存,但是其实它有700M的内存被临时放到了硬盘上。但是如果你用process explorer,就会看到,这个软件的private byte是1G,不会随着窗口的显示和隐藏而发生改变。
从操作系统的设计角度来看,数据在内存和硬盘之间的转移应该属于操作系统的职责,一个进程不应当越俎代庖。如果纯为了任务管理器好看,纯为了一些无聊的内存评测,那么我们完全可以把内存全都塞到硬盘上,你甚至可以看到浏览器只占1M的内存,但是这样用起来就会特别卡,因为每次需要访问数据时,都要从硬盘中现取,那速度自然可想而知了。有些朋友可能担心,说我开着浏览器的时候还要做别的事情,不能让浏览器把内存都吃掉,那么从这个角度考虑,就更应该把内存的管理权交给操作系统了,因为只有操作系统才知道你这个时候在做什么,操作系统会根据你当前的行为来决定内存的分配策略。而相反地,搜狗浏览器的开发人员并不知道你会做什么,极端一点说,如果搜狗浏览器强制“不许”把内存放到硬盘,那么有些用户就会说“搜狗浏览器好流畅啊,真爽”,但是另外一些用户就会说“搜狗真烂,一开搜狗,其他软件都巨卡”;相反地,如果搜狗浏览器强制把所有内存都放到硬盘,那么一些用户就会说“搜狗真省内存,一点也不影响其他软件运行”,但是另外一些用户就会说“搜狗太他妈卡了,根本没法用”。
我个人的观点是,搜狗以后可以推出多种模式供大家选择,比如有些用户喜欢关注“假”内存这个数字,那么就可以把内存全部交换到硬盘,以满足这些用户的一些癖好;而对于大多数普通用户,目前这样子应该说是最佳的状态(即把内存的管理权完全交给操作系统掌管)。
最后请各位喷子注意,我的观点仅供大家参考,但是如果你想在原理上————注意是“原理”上————喷我,那么我建议你先做一些功课再来喷,比如学学基本的操作系统原理,读读linux kernel源码,改改wrk什么的,以免你的水平比我低太多。
欢迎大家深入交流!
以上!