常用的浏览器软件有哪几种?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用的浏览器软件有哪几种?相关的知识,希望对你有一定的参考价值。

  1、IE浏览器(Internet explorer)

  IE浏览器是世界上使用最广泛的浏览器,它由微软公公司开发,预装在windows操作系统中。所以装完windows系统之后就会有IE浏览器。

  2、Safari浏览器

  Safari浏览器由苹果公司开发,它也是使用的比较广泛的浏览器之一。Safari预装在苹果操作系统当中,从2003年首发测试以来到现在已经11个年头。是苹果系统的专属浏览器,当然现在其他的操作系统也能装Safari。

  3、Firefox浏览器

  火狐浏览器是一个开源的浏览器,由Mozilla资金会和开源开发者一起开发。由于是开源的,所以它集成了很多小插件,开源拓展很多功能。发布于2002年,它也是世界上使用率前五的浏览器。

  4、Opera浏览器

  opera浏览器是由挪威一家软件公司开发,该浏览器创始于1995.目前其最新版本是opera 20.他有着快速小巧的特点,还有绿色版的,属于轻灵的浏览器。

  5、Chrome浏览器

  Chrome浏览器由谷歌公司开发,测试版本在2008年发布。虽说是比较年轻的浏览器,但是却以良好的稳定性,快速,安全性获得使用者的亲睐。

  6、其他浏览器

参考技术A IE 火狐 麦拓 傲游 腾讯TT Mozilla

相对来说遨游比较好
多页面浏览界面
不要再用旧的方式浏览了! Maxthon 带给你最先进的多页浏览器界面. 所有的网页都有序的排列在主窗口内. 您可以方便的在不同的页面间切换, 选择. 您也可以采用多种方式排列不同的页面, 方便进行对照和比较.

显示/隐藏图像

鼠标手势
用鼠标来给您的浏览器发命令! 当“鼠标手势”功能激活的时候. 您可以通过简单的移动鼠标就发命令给浏览器执行相应的动作, 高效, 节能. 有人说这感觉就像“拿着鼠标搓招”.

显示/隐藏图像
超级拖拽
Maxthon 向您推荐另一项革命性的技术“超级拖拽”. 当您激活“超级拖拽”功能以后, 您可以只是轻轻的拖拽一个链接然后松开, 就可以在一个新的窗口打开这个链接. 不仅如此, 您还可以选择一段文字, 轻轻拖拽, 然后放开, 如果这段文字是链接, 它将在新窗口打开, 如果是文字, 它将会使用缺省的搜索引擎进行搜索. 更棒的是, 如果您在拖拽文字或者图象的时候按着“Ctrl”键, 选择的文字或者图象就会自动的保存到预先定义好的目录里边去.

显示/隐藏图像

收藏栏
Maxthon 为用户提供了一个超越 IE 链接栏的更方便实用的收藏夹工具栏. 通过收藏夹工具栏用户可以更加方便快捷的访问收藏夹里边的内容. 通过 Maxthon 的收藏夹工具栏, 您还可以选择一次打开一个分类下的所有链接等等.

显示/隐藏图像

广告猎手
弹出式广告, 动画式广告, 浮动式广告...您是否已经对这些讨厌的广告厌烦了? Maxthon 给您提供了解决的方案: 广告猎手. 广告猎手包括了一系列的功能来防止各种广告. 智能化的自动过滤可以过滤掉大部分的弹出式广告, 您也可以通过预定义的列表来进行更加准确和有效的屏蔽. 通过使用内容过滤, 您更可以除去绝大部分的浮动式广告, 动画广告, 等等.

显示/隐藏图像

IE 扩展插件支持
Google 工具栏可以在第三方的浏览器上使用吗? 即使您去问 Google 自己, 它也会告诉您“不行”. 但是我们可以告诉您“可以”. 实际上, 不仅是 Google 工具栏, Maxthon 还可以支持其它的 IE 扩展插件如 FlashGet 工具条等.
我们发现新版本的 Google Toolbar 和 Maxthon (MyIE2) 有兼容性问题. 最后一个支持的版本可以从这里下载

显示/隐藏图像

外部工具栏
您也许需要在上网的时候使用一些其它软件. Maxthon 的外部工具栏可以把其它软件引入到 MyIE2 中, 使用它就像使用 Maxthon 本身的功能一样方便容易. 通过外部工具栏, 您不再需要切换到其它地方来启动需要的软件. 现在就把它们加入外部工具栏! 让所有的工具都变得那么方便. 并且, 您还可以设定这些工具随着 Maxthon 启动而启动, 关闭而关闭.

显示/隐藏图像

隐私保护
我们重视您的隐私安全. 通过使用 Maxthon, 您可以清除所有的浏览器遗留信息, 包括历史记录, cookie记录, 浏览器缓存, 等等. 而且更可以选择关闭 Maxthon 的时候自动清除这些信息. 方便快捷的包护您上网的隐私.

显示/隐藏图像

个性化皮肤
Maxthon 支持可以灵活设置的自定义皮肤. 您可以通过皮肤修改程序图标, 颜色和背景等等. 如果您想使用 Windows 的主题, 只需关闭 Maxthon 的内置皮肤即可. 目前已经有超过 300 个 Maxthon 皮肤可供您下载. 请访问 Maxthon 的皮肤站点, 看看 Maxthon 到底能有多漂亮.

显示/隐藏图像

插件系统
您可以通过插件来进一步增强 Maxthon 的功能. 除了 IE 插件外, Maxthon 还支持它自己的强大插件系统. 目前已经有 400 个以上为 Maxthon 编写的插件. 请访问插件站点为您的 Maxthon 添加更多功能.
兼容性和低资源占用
Maxthon 与 IE 完全兼容, 您可以在 Maxthon 获得 IE 中的所有功能. 而且在 IE 打开同样多窗口的情况下, Maxthon 使用的内存资源比 IE 平均少了 65% .
更多...
Maxthon 还有更多的功能可以提供给您, 如页面缩放, 简易搜集面板, 快捷搜索, Web 服务, 密码保护标签, 网址别名等等. 在浏览网络的时候它们会给您更好的冲浪感受.

http://cn.maxthon.com/chs/download.htm
参考资料:http://cn.maxthon.com/chs/features.htm本回答被提问者采纳
参考技术B Avant Browser

它采用了和IE相同的基础架构,但它拥有许多提升功能的额外设计。像多数非IE浏览器一样,它支持分页浏览并且可以水平或垂直排列几个浏览窗口。但是和Deepnet Explorer不一样的是,新的web 站点可以装载到现有的分页当中,只是它不支持浏览器多种外观。

Avant Browser 10最受争议的一点是其相当混乱的界面。它包括文件菜单在内一共有十个条目,而且众多快捷图标过于细小使你很难找到你想要的。

这使得浏览器在视觉上增加了用户的负担,尽管你可以将HTML文档的字体放大五倍。它还包括地址别名,用户可以在地址栏中输入自定义的短语,而不是完整的URL.例如输入‘gg’将进入www.google.com.

高级用户可以指定是否允许ActiveX 组件,脚本,或Java Applet.这提供了附加的安全性,虽然该浏览器面对IE相同的安全问题仍然会受到威胁。

由于其一系列优良特性,该浏览器的推荐度在IE之上。许多读者不会用到它的一些更高级的选项,如果不考虑其复杂的界面,Avant 可以算作一款强大并且功能完善的浏览器。在这里下载Avant Browser.

Deepnet Explorer

Deepnet Explorer集web 浏览,对等网络文件下载和RSS/Atom新闻阅读于一身。和Avant Browser 10类似的是,它是基于IE的,所以它的界面对多数用户来说应该不陌生。它最明显的区别在于分页窗口结构和支持水平和垂直分列浏览器窗口。

然而,其实现方式仍不够老练。例如,输入一个web 地址总是产生一个新的分页,因为没有在当前页面中装载新的内容,这使你不得不手动关闭浏览过的页面。

Deepnet Explorer中最与众不同的特性是它的对等网络下载功能。它使用Gnutella网络,所以具有一个相当大的用户基础并且有大量的文件可供选择而不会受到广告软件/ 间谍软件的骚扰。

RSS/Atom新闻阅读器允许你从web 站点申请新闻资讯,并且将它们发送到浏览器,所以你不必为阅读新闻打开web.

对于它的所有附加功能,该浏览器被证明存在和IE类似的问题。其相同的基础架构赋予它对大多数web 站点的广泛兼容性,但同时它也包含众多的安全漏洞,所以你需要从微软的web 站点下载更新以保持它和PC的安全。

帮助部分也是最小的,但是如果你能够容忍它的缺点,Deepnet Explorer是一款替代微软标准供应的强大浏览器。这里下载Deepnet Explorer.

微软Internet Explorer

我们中的大多数人都能正常的使用IE,这要感谢它对web 站点强大的兼容性。Service Pack 1的版本6 包括了近几年发布的所有安全更新,再加上一些有用的附件。因为带SP1 的IE也可以在带SP2 的Windows XP上运行,我们来测试它。

新的弹出广告拦截器比其他浏览器的相同功能工作得更好。尽管其他浏览器能够巧妙地拦截大多数自动弹出窗口,但是IE能够区分出不想要的弹出窗口和你需要的窗口。缺省情况下,弹出拦截敏感性设置为中级,但是在你访问包含强制性广告的站点时可以将它设置得更高。

在限制ActiveX 控件之后安全性改善了。如果某个站点试图向你的PC装载具有潜在危险内容或下载文件,地址栏下就会出现一个信息栏,让你选择是继续还是获得更多信息。

除此之外,IE缺乏其它特性的支持。它没有将支持分页浏览作为标准,所以你需要打开该程序的多个实例。他也不支持RSS feed,而且它是这些浏览器中最有可能成为间谍软件和其他恶意程序目标的浏览器。

用户界面非常易于使用,而且你很难找到一个无法显示的web 站点,但由于如此之多的高级浏览器可供选择,所以除非你经常访问的web 站点无法在其他浏览器中装载,否则不推荐使用IE. 这里下载Internet Explorer 6 Service Pack 1.

Mozilla Firefox

咋一看来,Mozilla Firefox 1.0 在这里似乎是最基本的浏览器。它具有必不可少的文件菜单,但缺省情况下,它只显示最需要的导航图标:后退,前进,刷新,停止和主页。

更进一步,你会发现一些有用的特性,包括一个内置的搜索框。Google是默认的搜索引擎,但其它还包括Yahoo ,Amazon,IMDB,和Dictionary.com. 要想提高灵活性,可以通过Mozilla 的web 站点添加更多的搜索引擎。

Firefox 以分页浏览为特色。和Deepnet Explorer不一样的是,已经打开的分页可以转向新的站点,尽管它缺乏使得你可以像Opera 7.54 中那样并排查看两个页面的工具。

Firefox 1.0 比IE受到的恶意攻击少的多。这很大程度上是因为黑客和病毒编写者将目标对准最常用的软件,但也是因为Firefox 缺乏对 VBscript和ActiveX 控件的支持。所以,该浏览器可能无法正确地显示某些页面。更糟糕的是,诸如Launch.com这样的音乐视频站点和类似Inotes和Outlook Web Access这样的联机邮件客户端根本不能显示某些内容。

结果是你的PC基本不会被间谍软件感染,结合Firefox 卓越的特性列表,这就是说它与在这里讨论的许多浏览器相比是日常冲浪的非常好的选择。这里下载Mozilla Firefox.

Netscape Navigator

Navigator 7.2 基于Mozilla 软件,但是其相当呆板的界面和Firefox 使用的灵巧的界面相去甚远。冗长的安装过程也会引起问题。其安装文件只有288KB 大小,但随后需要下载的文件总共有27MB,这对于拨号的调制解调器需要一个小时的时间。

你可以自定义安装过程,排除诸如桌面天气预报软件,集成的邮件客户端和AOL Instant Messenger 这样的多余组件。这可以将大小减小到更易于管理的12MB.

即使没有这些组件,Navigator 7.2 仍拥有优良的特性。它有优秀的弹出广告拦截并且允许分页浏览。还有就是它能比它的前辈以更快的速度显示web 页面,拥有一个新的口令管理器以允许你查看在浏览期间保存的口令列表。

你可以设置一个主口令以防止对该列表的访问,但在我们的测试中,我们无需提供任何认证就可以访问所有登录的细节。如果不止一个人能访问你的PC,这可能是危险的,因为使用者不仅在登录的时候能看到你的详细信息,而且还可以看到你在进行访问时使用的口令。

基本来说,Navigator 7.2 在这个系列中最受欢迎。它缺少了市场上一些更高级的浏览器华而不实的东西,由于它的Mozilla 核心,使得它是一个完全能同IE媲美的选择。

Opera

Opera 7.54拥有一些同这里的其他浏览器相比独一无二的特性。其中最不同寻常的就是重绕和快速前进按钮。前者将你带回到你正在访问的web 站点的首页,以免你浏览太深而迷路,后者试图猜测在指定站点上你可能将要访问的下一个页面。

它们非常有效并且在基于web 的图像幻灯片显示上精确地模仿了‘下一个’按钮。Opera 还包含了鼠标表示法,所以你可以以不同的方式移动你的输入设备,以使导航器或浏览器做出相应的反应。例如,按住鼠标右键并将鼠标向左移动,将带你进入上一个页面。

它是这里允许在单个窗口中打开个多文档的仅有的两个浏览器之一,并且包括水平和垂直排列。它还拥有一个上下文相关的菜单,当你双击某个web 页面上的任何文本时,它将加载一个语言翻译器,字典或搜索引擎。哄骗模式允许Opera 将自己看作一个IE或Mozilla 浏览器,但这并不总是可靠的。

完整版的Opera 需要24美元的注册费用,但多数用户会选择有广告的免费版(很容易就习惯)。一些用户可能感觉Opera 的一些功能多少有些多余,但对于高级冲浪,很少有能够与Opera 形成竞争从而成为我们的‘编辑的选择’的优胜者。这里下载Opera

编辑的选择

在Service Packs 1 和2 发布之前,Internet Explorer 是一个功能不够完善并且容易受到攻击的web 浏览器。即使增加了这些组件之后,就像我们这个分组测试中说明的那样,它仍然比它的竞争对手落后了一大截。

选择使用哪个浏览器很大程度上依赖于你访问的站点。许多web 开发者懒于去创建不仅仅和Internet Explorer 兼容的web 站点。所以,你或许最好使用某个基于IE的浏览器,例如Deepnet Explorer或者我们重点推荐的第一个获胜者,Avant Browser 10.

后者除了良好的兼容性,还提供了一些旨在加强导航的有用功能,例如分页浏览。由于有了非常方便的地址别名,访问那些URL 很长的web 站点变得更加容易,它允许你用短小而容易记忆的名称代替冗长的URL.

不幸的是,和Deepnet Explorer一样,Avant Browser 有和IE相同的安全缺陷,这需要定期的安全更新。所以,有安全意识的用户可能更喜欢选择我们重点推荐的第二名,Mozilla Firefox 1.0.

Firefox 1.0 有许多非常好的特性,包括拦截弹出式(pop-up)和隐藏的(pop-under )弹出式广告,分页浏览,以及一个下载管理器。它可以在一个单独的窗口内组织下载任务,而不是为每个文件传输分别打开窗口。

不幸的是,Firefox 1.0 不支持ActiveX 控件或VBScript. 因为你可能无法为一个邮件客户端装载诸如Inotes或 Outlook Web Access 这样的web 界面,所以这可能会限制它在企业环境中的应用。

我们编辑的选择是Opera 7.54. 这是本组中功能最全面的浏览器。它集成了一些非常有用的功能,例如多文档支持,允许你在一个窗口内排列几个浏览页面。

它还是本组中唯一一个无需软件插件就支持鼠标动作的浏览器。通过配合快速向前和重绕按钮,使得控制浏览器和浏览web 页面变得更加容易。

Opera 7.54继承了所有基于非Internet Explorer 浏览器相同的缺陷,但它具有的一个浏览器模式,利用这种模式有时可以欺骗web 站点,以为它是IE或Mozilla 浏览器。

有些时候只有微软的东西才有效,所有你不要完全放弃IE,但对于日常的浏览,我们确信你将找到一个能够提供巨大便利的选择。
参考技术C 傲游 苹果 TT

常用的内存管理方法有哪几种

参考技术A

  常用的内存管理 方法 有哪几种?下面是我给大家收集整理的一些相关方法技巧,希望对大家有帮助!

   常用的内存管理方法

  传统的内存整理软件工作原理大概是:先申请一块“巨大内存”。因为物理内存几乎全被内存整理软件占用,因此Windows被迫把其他软件的内存数据转移到硬盘上的“虚拟内存交换文件”(PageFile)中,完成这一过程之后内存整理软件就会释放掉刚刚申请的内存,至此整理过程完成,可用物理内存显著增加。

  大体上都是那么回事,就是通过辅助空间,重新安排内存内容 ....

  但是其中使用的算法,效率是有很大的区别的 ~~ <script type="text/javascript"><!-- google_ad_client = "pub-4403405132739389"; google_ad_width = 250; google_ad_height = 250; google_ad_format = "250x250_as"; google_ad_type = "text"; //2007-10-22: 250*250 google_ad_channel = "7687946060"; google_ui_features = "rc:10"; //--> </script><script type="text/javascript" src=pagead2.googlesyndication/pagead/show_ads.js"> </script>

  拓荒时代

  国内的程序员大多是在 Java 语言中第一次感受到垃圾收集技术的巨大魅力的,许多人也因此把 Java 和垃圾收集看成了密不可分的整体。但事实上,垃圾收集技术早在 Java 语言问世前 30 多年就已经发展和成熟起来了, Java 语言所做的不过是把这项神奇的技术带到了广大程序员身边而已。

  如果一定要为垃圾收集技术找一个孪生兄弟,那么, Lisp 语言才是当之无愧的人选。 1960 年前后诞生于 MIT 的 Lisp 语言是第一种高度依赖于动态内存分配技术的语言: Lisp 中几乎所有数据都以“表”的形式出现,而“表”所占用的空间则是在堆中动态分配得到的。 Lisp 语言先天就具有的动态内存管理特性要求 Lisp 语言的设计者必须解决堆中每一个内存块的自动释放问题(否则, Lisp 程序员就必然被程序中不计其数的 free 或 delete 语句淹没),这直接导致了垃圾收集技术的诞生和发展——说句题外话,上大学时,一位老师曾告诉我们, Lisp 是对现代软件开发技术贡献最大的语言。我当时对这一说法不以为然:布满了圆括号,看上去像迷宫一样的 Lisp 语言怎么能比 C 语言或 Pascal 语言更伟大呢?不过现在,当我知道垃圾收集技术、数据结构技术、人工智能技术、并行处理技术、虚拟机技术、元数据技术以及程序员们耳熟能详的许多技术都起源于 Lisp 语言时,我特别想向那位老师当面道歉,并收回我当时的幼稚想法。

  知道了 Lisp 语言与垃圾收集的密切关系,我们就不难理解,为什么垃圾收集技术的两位先驱者 J. McCarthy 和 M. L. Minsky 同时也是 Lisp 语言发展史上的重要人物了。 J. McCarthy 是 Lisp 之父,他在发明 Lisp 语言的同时也第一次完整地描述了垃圾收集的算法和实现方式; M. L. Minsky 则在发展 Lisp 语言的过程中成为了今天好几种主流垃圾收集算法的奠基人——和当时不少技术大师的经历相似, J. McCarthy 和 M. L. Minsky 在许多不同的技术领域里都取得了令人艳羡的成就。也许,在 1960 年代那个软件开发史上的拓荒时代里,思维敏捷、意志坚定的研究者更容易成为无所不能的西部硬汉吧。

  在了解垃圾收集算法的起源之前,有必要先回顾一下内存分配的主要方式。我们知道,大多数主流的语言或运行环境都支持三种最基本的内存分配方式,它们分别是:

  一、静态分配( Static Allocation ):静态变量和全局变量的分配形式。我们可以把静态分配的内存看成是家里的耐用家具。通常,它们无需释放和回收,因为没人会天天把大衣柜当作垃圾扔到窗外。

  二、自动分配( Automatic Allocation ):在栈中为局部变量分配内存的方法。栈中的内存可以随着代码块退出时的出栈操作被自动释放。这类似于到家中串门的访客,天色一晚就要各回各家,除了个别不识时务者以外,我们一般没必要把客人捆在垃圾袋里扫地出门。

  三、动态分配( Dynamic Allocation ):在堆中动态分配内存空间以存储数据的方式。堆中的内存块好像我们日常使用的餐巾纸,用过了就得扔到垃圾箱里,否则屋内就会满地狼藉。像我这样的懒人做梦都想有一台家用机器人跟在身边打扫卫生。在软件开发中,如果你懒得释放内存,那么你也需要一台类似的机器人——这其实就是一个由特定算法实现的垃圾收集器。

  也就是说,下面提到的所有垃圾收集算法都是在程序运行过程中收集并清理废旧“餐巾纸”的算法,它们的操作对象既不是静态变量,也不是局部变量,而是堆中所有已分配内存块。

   引用计数( Reference Counting )算法

  1960 年以前,人们为胚胎中的 Lisp 语言设计垃圾收集机制时,第一个想到的算法是引用计数算法。拿餐巾纸的例子来说,这种算法的原理大致可以描述为:

  午餐时,为了把脑子里突然跳出来的设计灵感记下来,我从餐巾纸袋中抽出一张餐巾纸,打算在上面画出系统架构的蓝图。按照“餐巾纸使用规约之引用计数版”的要求,画图之前,我必须先在餐巾纸的一角写上计数值 1 ,以表示我在使用这张餐巾纸。这时,如果你也想看看我画的蓝图,那你就要把餐巾纸上的计数值加 1 ,将它改为 2 ,这表明目前有 2 个人在同时使用这张餐巾纸(当然,我是不会允许你用这张餐巾纸来擦鼻涕的)。你看完后,必须把计数值减 1 ,表明你对该餐巾纸的使用已经结束。同样,当我将餐巾纸上的内容全部誊写到 笔记本 上之后,我也会自觉地把餐巾纸上的计数值减 1 。此时,不出意外的话,这张餐巾纸上的计数值应当是 0 ,它会被垃圾收集器——假设那是一个专门负责打扫卫生的机器人——捡起来扔到垃圾箱里,因为垃圾收集器的惟一使命就是找到所有计数值为 0 的餐巾纸并清理它们。

  引用计数算法的优点和缺陷同样明显。这一算法在执行垃圾收集任务时速度较快,但算法对程序中每一次内存分配和指针操作提出了额外的要求(增加或减少内存块的引用计数)。更重要的是,引用计数算法无法正确释放循环引用的内存块,对此, D. Hillis 有一段风趣而精辟的论述:

  一天,一个学生走到 Moon 面前说:“我知道如何设计一个更好的垃圾收集器了。我们必须记录指向每个结点的指针数目。” Moon 耐心地给这位学生讲了下面这个 故事 :“一天,一个学生走到 Moon 面前说:‘我知道如何设计一个更好的垃圾收集器了……’”

  D. Hillis 的故事和我们小时候常说的“从前有座山,山上有个庙,庙里有个老和尚”的故事有异曲同工之妙。这说明,单是使用引用计数算法还不足以解决垃圾收集中的所有问题。正因为如此,引用计数算法也常常被研究者们排除在狭义的垃圾收集算法之外。当然,作为一种最简单、最直观的解决方案,引用计数算法本身具有其不可替代的优越性。 1980 年代前后, D. P. Friedman , D. S. Wise , H. G. Baker 等人对引用计数算法进行了数次改进,这些改进使得引用计数算法及其变种(如延迟计数算法等)在简单的环境下,或是在一些综合了多种算法的现代垃圾收集系统中仍然可以一展身手。

   标记-清除( Mark-Sweep )算法

  第一种实用和完善的垃圾收集算法是 J. McCarthy 等人在 1960 年提出并成功地应用于 Lisp 语言的标记-清除算法。仍以餐巾纸为例,标记-清除算法的执行过程是这样的:

  午餐过程中,餐厅里的所有人都根据自己的需要取用餐巾纸。当垃圾收集机器人想收集废旧餐巾纸的时候,它会让所有用餐的人先停下来,然后,依次询问餐厅里的每一个人:“你正在用餐巾纸吗?你用的是哪一张餐巾纸?”机器人根据每个人的回答将人们正在使用的餐巾纸画上记号。询问过程结束后,机器人在餐厅里寻找所有散落在餐桌上且没有记号的餐巾纸(这些显然都是用过的废旧餐巾纸),把它们统统扔到垃圾箱里。

  正如其名称所暗示的那样,标记-清除算法的执行过程分为“标记”和“清除”两大阶段。这种分步执行的思路奠定了现代垃圾收集算法的思想基础。与引用计数算法不同的是,标记-清除算法不需要运行环境监测每一次内存分配和指针操作,而只要在“标记”阶段中跟踪每一个指针变量的指向——用类似思路实现的垃圾收集器也常被后人统称为跟踪收集器( Tracing Collector )

  伴随着 Lisp 语言的成功,标记-清除算法也在大多数早期的 Lisp 运行环境中大放异彩。尽管最初版本的标记-清除算法在今天看来还存在效率不高(标记和清除是两个相当耗时的过程)等诸多缺陷,但在后面的讨论中,我们可以看到,几乎所有现代垃圾收集算法都是标记-清除思想的延续,仅此一点, J. McCarthy 等人在垃圾收集技术方面的贡献就丝毫不亚于他们在 Lisp 语言上的成就了。

   复制( Copying )算法

  为了解决标记-清除算法在垃圾收集效率方面的缺陷, M. L. Minsky 于 1963 年发表了著名的论文“一种使用双存储区的 Lisp 语言垃圾收集器( A LISP Garbage Collector Algorithm Using Serial Secondary Storage )”。 M. L. Minsky 在该论文中描述的算法被人们称为复制算法,它也被 M. L. Minsky 本人成功地引入到了 Lisp 语言的一个实现版本中。

  复制算法别出心裁地将堆空间一分为二,并使用简单的复制操作来完成垃圾收集工作,这个思路相当有趣。借用餐巾纸的比喻,我们可以这样理解 M. L. Minsky 的复制算法:

  餐厅被垃圾收集机器人分成南区和北区两个大小完全相同的部分。午餐时,所有人都先在南区用餐(因为空间有限,用餐人数自然也将减少一半),用餐时可以随意使用餐巾纸。当垃圾收集机器人认为有必要回收废旧餐巾纸时,它会要求所有用餐者以最快的速度从南区转移到北区,同时随身携带自己正在使用的餐巾纸。等所有人都转移到北区之后,垃圾收集机器人只要简单地把南区中所有散落的餐巾纸扔进垃圾箱就算完成任务了。下一次垃圾收集的工作过程也大致类似,惟一的不同只是人们的转移方向变成了从北区到南区。如此循环往复,每次垃圾收集都只需简单地转移(也就是复制)一次,垃圾收集速度无与伦比——当然,对于用餐者往返奔波于南北两区之间的辛劳,垃圾收集机器人是决不会流露出丝毫怜悯的。

  M. L. Minsky 的发明绝对算得上一种奇思妙想。分区、复制的思路不仅大幅提高了垃圾收集的效率,而且也将原本繁纷复杂的内存分配算法变得前所未有地简明和扼要(既然每次内存回收都是对整个半区的回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存就可以了),这简直是个奇迹!不过,任何奇迹的出现都有一定的代价,在垃圾收集技术中,复制算法提高效率的代价是人为地将可用内存缩小了一半。实话实说,这个代价未免也太高了一些。

  无论优缺点如何,复制算法在实践中都获得了可以与标记-清除算法相比拟的成功。除了 M. L. Minsky 本人在 Lisp 语言中的工作以外,从 1960 年代末到 1970 年代初, R. R. Fenichel 和 J. C. Yochelson 等人也相继在 Lisp 语言的不同实现中对复制算法进行了改进, S. Arnborg 更是成功地将复制算法应用到了 Simula 语言中。

  至此,垃圾收集技术的三大传统算法——引用计数算法、标记-清除算法和复制算法——都已在 1960 年前后相继问世,三种算法各有所长,也都存在致命的缺陷。从 1960 年代后期开始,研究者的主要精力逐渐转向对这三种传统算法进行改进或整合,以扬长避短,适应程序设计语言和运行环境对垃圾收集的效率和实时性所提出的更高要求。

  走向成熟

  从 1970 年代开始,随着科学研究和应用实践的不断深入,人们逐渐意识到,一个理想的垃圾收集器不应在运行时导致应用程序的暂停,不应额外占用大量的内存空间和 CPU 资源,而三种传统的垃圾收集算法都无法满足这些要求。人们必须提出更新的算法或思路,以解决实践中碰到的诸多难题。当时,研究者的努力目标包括:

  第一,提高垃圾收集的效率。使用标记-清除算法的垃圾收集器在工作时要消耗相当多的 CPU 资源。早期的 Lisp 运行环境收集内存垃圾的时间竟占到了系统总运行时间的 40% !——垃圾收集效率的低下直接造就了 Lisp 语言在执行速度方面的坏名声;直到今天,许多人还条件反射似地误以为所有 Lisp 程序都奇慢无比。

  第二,减少垃圾收集时的内存占用。这一问题主要出现在复制算法中。尽管复制算法在效率上获得了质的突破,但牺牲一半内存空间的代价仍然是巨大的。在计算机发展的早期,在内存价格以 KB 计算的日子里,浪费客户的一半内存空间简直就是在变相敲诈或拦路打劫。

  第三,寻找实时的垃圾收集算法。无论执行效率如何,三种传统的垃圾收集算法在执行垃圾收集任务时都必须打断程序的当前工作。这种因垃圾收集而造成的延时是许多程序,特别是执行关键任务的程序没有办法容忍的。如何对传统算法进行改进,以便实现一种在后台悄悄执行,不影响——或至少看上去不影响——当前进程的实时垃圾收集器,这显然是一件更具挑战性的工作。

  研究者们探寻未知领域的决心和研究工作的进展速度同样令人惊奇:在 1970 年代到 1980 年代的短短十几年中,一大批在实用系统中表现优异的新算法和新思路脱颖而出。正是因为有了这些日趋成熟的垃圾收集算法,今天的我们才能在 Java 或 .NET 提供的运行环境中随心所欲地分配内存块,而不必担心空间释放时的风险。

   标记-整理( Mark-Compact )算法

  标记-整理算法是标记-清除算法和复制算法的有机结合。把标记-清除算法在内存占用上的优点和复制算法在执行效率上的特长综合起来,这是所有人都希望看到的结果。不过,两种垃圾收集算法的整合并不像 1 加 1 等于 2 那样简单,我们必须引入一些全新的思路。 1970 年前后, G. L. Steele , C. J. Cheney 和 D. S. Wise 等研究者陆续找到了正确的方向,标记-整理算法的轮廓也逐渐清晰了起来:

  在我们熟悉的餐厅里,这一次,垃圾收集机器人不再把餐厅分成两个南北区域了。需要执行垃圾收集任务时,机器人先执行标记-清除算法的第一个步骤,为所有使用中的餐巾纸画好标记,然后,机器人命令所有就餐者带上有标记的餐巾纸向餐厅的南面集中,同时把没有标记的废旧餐巾纸扔向餐厅北面。这样一来,机器人只消站在餐厅北面,怀抱垃圾箱,迎接扑面而来的废旧餐巾纸就行了。

  实验表明,标记-整理算法的总体执行效率高于标记-清除算法,又不像复制算法那样需要牺牲一半的存储空间,这显然是一种非常理想的结果。在许多现代的垃圾收集器中,人们都使用了标记-整理算法或其改进版本。

   增量收集( Incremental Collecting )算法

  对实时垃圾收集算法的研究直接导致了增量收集算法的诞生。

  最初,人们关于实时垃圾收集的想法是这样的:为了进行实时的垃圾收集,可以设计一个多进程的运行环境,比如用一个进程执行垃圾收集工作,另一个进程执行程序代码。这样一来,垃圾收集工作看上去就仿佛是在后台悄悄完成的,不会打断程序代码的运行。

  在收集餐巾纸的例子中,这一思路可以被理解为:垃圾收集机器人在人们用餐的同时寻找废弃的餐巾纸并将它们扔到垃圾箱里。这个看似简单的思路会在设计和实现时碰上进程间冲突的难题。比如说,如果垃圾收集进程包括标记和清除两个工作阶段,那么,垃圾收集器在第一阶段中辛辛苦苦标记出的结果很可能被另一个进程中的内存操作代码修改得面目全非,以至于第二阶段的工作没有办法开展。

  M. L. Minsky 和 D. E. Knuth 对实时垃圾收集过程中的技术难点进行了早期的研究, G. L. Steele 于 1975 年发表了题为“多进程整理的垃圾收集( Multiprocessing compactifying garbage collection )”的论文,描述了一种被后人称为“ Minsky-Knuth-Steele 算法”的实时垃圾收集算法。 E. W. Dijkstra , L. Lamport , R. R. Fenichel 和 J. C. Yochelson 等人也相继在此领域做出了各自的贡献。 1978 年, H. G. Baker 发表了“串行计算机上的实时表处理技术( List Processing in Real Time on a Serial Computer )”一文,系统阐述了多进程环境下用于垃圾收集的增量收集算法。

  增量收集算法的基础仍是传统的标记-清除和复制算法。增量收集算法通过对进程间冲突的妥善处理,允许垃圾收集进程以分阶段的方式完成标记、清理或复制工作。详细分析各种增量收集算法的内部机理是一件相当繁琐的事情,在这里,读者们需要了解的仅仅是: H. G. Baker 等人的努力已经将实时垃圾收集的梦想变成了现实,我们再也不用为垃圾收集打断程序的运行而烦恼了。

   分代收集( Generational Collecting )算法

  和大多数软件开发技术一样,统计学原理总能在技术发展的过程中起到强力催化剂的作用。 1980 年前后,善于在研究中使用统计分析知识的技术人员发现,大多数内存块的生存周期都比较短,垃圾收集器应当把更多的精力放在检查和清理新分配的内存块上。这个发现对于垃圾收集技术的价值可以用餐巾纸的例子概括如下:

  如果垃圾收集机器人足够聪明,事先摸清了餐厅里每个人在用餐时使用餐巾纸的习惯——比如有些人喜欢在用餐前后各用掉一张餐巾纸,有的人喜欢自始至终攥着一张餐巾纸不放,有的人则每打一个喷嚏就用去一张餐巾纸——机器人就可以制定出更完善的餐巾纸回收计划,并总是在人们刚扔掉餐巾纸没多久就把垃圾捡走。这种基于统计学原理的做法当然可以让餐厅的整洁度成倍提高。

  D. E. Knuth , T. Knight , G. Sussman 和 R. Stallman 等人对内存垃圾的分类处理做了最早的研究。 1983 年, H. Lieberman 和 C. Hewitt 发表了题为“基于对象寿命的一种实时垃圾收集器( A real-time garbage collector based on the lifetimes of objects )”的论文。这篇著名的论文标志着分代收集算法的正式诞生。此后,在 H. G. Baker , R. L. Hudson , J. E. B. Moss 等人的共同努力下,分代收集算法逐渐成为了垃圾收集领域里的主流技术。

  分代收集算法通常将堆中的内存块按寿命分为两类,年老的和年轻的。垃圾收集器使用不同的收集算法或收集策略,分别处理这两类内存块,并特别地把主要工作时间花在处理年轻的内存块上。分代收集算法使垃圾收集器在有限的资源条件下,可以更为有效地工作——这种效率上的提高在今天的 Java 虚拟机中得到了最好的证明。

  应用浪潮

  Lisp 是垃圾收集技术的第一个受益者,但显然不是最后一个。在 Lisp 语言之后,许许多多传统的、现代的、后现代的语言已经把垃圾收集技术拉入了自己的怀抱。随便举几个例子吧:诞生于 1964 年的 Simula 语言, 1969 年的 Smalltalk 语言, 1970 年的 Prolog 语言, 1973 年的 ML 语言, 1975 年的 Scheme 语言, 1983 年的 Modula-3 语言, 1986 年的 Eiffel 语言, 1987 年的 Haskell 语言……它们都先后使用了自动垃圾收集技术。当然,每一种语言使用的垃圾收集算法可能不尽相同,大多数语言和运行环境甚至同时使用了多种垃圾收集算法。但无论怎样,这些实例都说明,垃圾收集技术从诞生的那一天起就不是一种曲高和寡的“学院派”技术。

  对于我们熟悉的 C 和 C++ 语言,垃圾收集技术一样可以发挥巨大的功效。正如我们在学校中就已经知道的那样, C 和 C++ 语言本身并没有提供垃圾收集机制,但这并不妨碍我们在程序中使用具有垃圾收集功能的函数库或类库。例如,早在 1988 年, H. J. Boehm 和 A. J. Demers 就成功地实现了一种使用保守垃圾收集算法( Conservative GC Algorithmic )的函数库。我们可以在 C 语言或 C++ 语言中使用该函数库完成自动垃圾收集功能,必要时,甚至还可以让传统的 C/C++ 代码与使用自动垃圾收集功能的 C/C++ 代码在一个程序里协同工作。

  1995 年诞生的 Java 语言在一夜之间将垃圾收集技术变成了软件开发领域里最为流行的技术之一。从某种角度说,我们很难分清究竟是 Java 从垃圾收集中受益,还是垃圾收集技术本身借 Java 的普及而扬名。值得注意的是,不同版本的 Java 虚拟机使用的垃圾收集机制并不完全相同, Java 虚拟机其实也经过了一个从简单到复杂的发展过程。在 Java 虚拟机的 1.4.1 版中,人们可以体验到的垃圾收集算法就包括分代收集、复制收集、增量收集、标记-整理、并行复制( Parallel Copying )、并行清除( Parallel Scavenging )、并发( Concurrent )收集等许多种, Java 程序运行速度的不断提升在很大程度上应该归功于垃圾收集技术的发展与完善。

  尽管历史上已经有许多包含垃圾收集技术的应用平台和 操作系统 出现,但 Microsoft .NET 却是第一种真正实用化的、包含了垃圾收集机制的通用语言运行环境。事实上, .NET 平台上的所有语言,包括 C# 、 Visual Basic .NET 、 Visual C++ .NET 、 J# 等等,都可以通过几乎完全相同的方式使用 .NET 平台提供的垃圾收集机制。我们似乎可以断言, .NET 是垃圾收集技术在应用领域里的一次重大变革,它使垃圾收集技术从一种单纯的技术变成了应用环境乃至操作系统中的一种内在 文化 。这种变革对未来软件开发技术的影响力也许要远远超过 .NET 平台本身的商业价值。

  大势所趋

  今天,致力于垃圾收集技术研究的人们仍在不懈努力,他们的研究方向包括分布式系统的垃圾收集、复杂事务环境下的垃圾收集、数据库等特定系统的垃圾收集等等。

  但在程序员中间,仍有不少人对垃圾收集技术不屑一顾,他们宁愿相信自己逐行编写的 free 或 delete 命令,也不愿把垃圾收集的重任交给那些在他们看来既蠢又笨的垃圾收集器。

  我个人认为,垃圾收集技术的普及是大势所趋,这就像生活会越来越好一样毋庸置疑。今天的程序员也许会因为垃圾收集器要占用一定的 CPU 资源而对其望而却步,但二十多年前的程序员还曾因为高级语言速度太慢而坚持用机器语言写程序呢!在硬件速度日新月异的今天,我们是要吝惜那一点儿时间损耗而踟躇不前,还是该坚定不移地站在代码和运行环境的净化剂——垃圾收集的一边呢?

以上是关于常用的浏览器软件有哪几种?的主要内容,如果未能解决你的问题,请参考以下文章

js设计模式有哪几种

软件主要有哪几种封装方法

软件的系统架构和开发平台有哪些?具体都有哪几种呢?

linux安装软件有哪几种方式

Rendering Engine 主流的浏览器内核(排版引擎渲染引擎解释引擎)有哪几种,分别的特点

开发环境指的是啥