火狐的分代垃圾回收机制

来自 转载请保留地址:http://www.lenky.info/archives/2014/09/2445 或 http://lenky.info/?p=2445

Mozilla Firefox 32.0.3于近几天发布,在Firefox的javascript引擎SpiderMonkey里启用了一个名为分代垃圾回收机制(Generational garbage collection (GGC))的新特性,它的主要作用是用于性能优化。
 简单Mark一下:
 1,原始问题:
 以前的垃圾回收机制是对所有创建的对象进行扫描,判断其是否存活并对已死亡的对象进行回收。如果存活的对象总量并不多,那么这种回收机制没有太大的问题;但是,如果存活的对象总量很多,那么每次进行垃圾回收时,都要去扫描所有的对象,然后判断其是否存活,即便是那些可能从上次扫描到此次扫描的这一段时间没有做过任何改动的对象也会被扫描和判断,因此这无形中就做了很多无用的功夫,性能损耗即在此。


2,改进措施(GGC):
 最直观的改进措施就是把对象进行区别对待,首先是Nursery:每一个新创建的对象属于新生代,在Nursery内存区域分配。当Nursery满时,垃圾回收机制只扫描这一块区域,而根据局部性原理,常规情况下此时大部分新生代对象都已死亡而被回收,而那些依然存活的对象可以被划归老一代,而转存入Tenured区域。经过新生代的回收过滤,Tenured区域的老一代对象的增长就不会那么快,但当Tenured区域满时,同样也将进行垃圾回收。如果把对Nursery区域的扫描称为minor GC,那么对Tenured区域的扫描就可以称为major GC,很显然,minor GC会经常进行并且较快,而major GC会相对较慢,但执行的次数也会相对较少。简言之,通过把对象进行分代隔开扫描,从而避免了不必要的对象扫描动作,来提升整体回收效率。


3,额外开销:
 既然引入了分代机制,那么就需要增加额外的开销来实现这个逻辑。
 比如:如何判断一个新生代对象是否仍然存活?
 可以这样:通过新生代对象与老一代对象的关联性来进行判断。也就是这样:
 Tenured => Nursery
 即,新生代对象被老一代对象引用着,新生代对象还要被老一代对象所使用,所以此时新生代当然是存活的。比如如果一个新生代对象是作为一个老一代对象的属性被创建,那么它就应该是依然存活的。


通过
 Tenured => Nursery
 来判断新生代对象与老一代对象的关联性是可以的,但具体如何来做?扫描所有的老一代对象来进行检测?这明显不是好办法,因为那会导致每一次minor GC都要进行类似于一次major GC了。
 另外一种方法就是关注每一次对老一代对象的修改,如果发现有对新生代对象的引用操作(比如新引用了一个新生代对象,或修改/删除了对新生代对象的引用等等),就记录下来。这个记录不会太多,因为只需记录从上一次minor GC以来的即可,在进行下一次minor GC时就只需扫描这些记录来判断新生代对象是否存活即可。也就是那些仍被老一代对象所引用的新生代对象是依然存活的,当然,如果一个新生代对象被判断为存活,那么它引用的另外的新生代对象也是存活的,所以在扫描记录的过程中也需要同步的更新记录。
 记录的操作就有一些额外的开销,因此可能在某些情况下,GGC反而会更慢,但在大多数情况下,GGC肯定是足够好的。


4,分配性能:
 GGC可以加速对象分配速度,原理可以大致类似于内存池,比如Nursery区域,除非它已满,否则你可以从上一次分配的末尾处往后取一块空间即可。不用管是否已经使用(因为是未满的Nursery区域,必定是没有使用的),也不用管是否需要释放(所以就没有必要记录相关释放信息,释放会在minor GC统一做)。
 不过对于Tenured区域,对象分配就和以前方式差不多,不过一般情况下,因为Tenured区域的对象比较少,所以就整体性能而言,GGC分配方式相比以前较优。


详细的描述在这里:https://hacks.mozilla.org/2014/09/generational-garbage-collection-in-firefox/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Firefox 是一款流行的网络浏览器,它支持使用代理服务器来连接网络。为了增加用户功能和便利性,Firefox 提供了许多代理插件,用于管理和配置代理服务器。 代理插件可以帮助用户更方便地设置和切换代理服务器。通过这些插件,用户可以轻松地添加、删除、编辑和切换代理服务器配置。用户只需在插件界面中输入代理服务器的地址和端口号等信息,即可完成代理服务器的设置。 此外,代理插件还可以提供一些附加功能,如代理服务器的国家/地区选择、IP地址伪装、广告拦截等。用户可以根据自己的需求选择相应的插件,并根据插件的功能进行配置。 Firefox 的代理插件还具有一些其他优点。首先,大多数插件都提供简单直观的用户界面,方便新手用户使用。其次,插件之间通常兼容性良好,用户可以同时安装多个代理插件,根据需要进行切换。最后,代理插件通常能够自动检测代理服务器的可用性,并实时更新服务器列表,确保用户始终能够连接到稳定和高效的代理服务器。 然而,使用代理插件也存在一些潜在的问题。有些免费的代理服务器可能不稳定或速度较慢,影响用户的上网体验。此外,使用代理服务器也可能给用户带来一定的安全风险,例如个人数据的泄露等。 总的来说,Firefox 代理插件提供了方便的代理服务器配置和管理功能,并可以增强用户的上网体验。用户可以根据自己的需求选择合适的插件,并注意选择稳定和安全的代理服务器。 ### 回答2: Firefox 代理插件是一种可以在Firefox浏览器中应用的工具,用于帮助用户更方便地使用代理服务器来访问互联网。代理服务器是充当用户与互联网之间的中间人,通过代理服务器发送和接收网络请求,隐藏用户真实的IP地址,并提供一些额外的功能。 Firefox的代理插件可以用来修改浏览器的网络设置,以便使用代理服务器。用户只需安装相应的插件并进行简单的配置设置,即可使用代理服务器进行网络访问。 使用代理插件有许多好处。首先,它可以帮助用户维护隐私和匿名性。通过使用代理服务器,用户的真实IP地址将被隐藏,从而增加了用户在互联网上的匿名性。其次,代理插件可以突破地域限制。有些网站或服务在特定地区是不可访问的,但通过使用代理服务器,用户可以绕过这些限制,以便访问被屏蔽的内容。此外,代理插件还可以提供更好的网络性能和安全性。 Firefox提供了许多不同的代理插件供用户选择。一些受欢迎的插件包括:Foxxie、Proxy Switcher and Manager、FoxyProxy,等等。这些插件通常具有用户友好的界面,可以轻松地设置代理服务器和规则,并提供一些高级的功能,例如切换代理服务器、自动切换代理规则等。 需要注意的是,代理插件仅适用于浏览器的网络请求,并不能保护整个操作系统的网络连接。如果用户希望在整个操作系统中使用代理,需要通过其他方式进行设置。 总而言之,Firefox代理插件是一种实用的工具,可以帮助用户使用代理服务器来访问互联网,提高隐私和匿名性,突破地域限制,提供更好的网络性能和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值