快速业务通道

Eclipse的字符串分区共享优化机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
); *p != NULL;) {     stringTableEntry* entry = *p;     assert(entry->literal_string() != NULL, "just checking");     if (entry->literal_string()->is_gc_marked()) { // 字符串对象是否可达      // Is this one of calls those necessary only for verification? (DLD)      entry->oops_do(&MarkSweep::follow_root_closure);      p = entry->next_addr();     } else { // 如不可达则将其内存块回收到内存池中      *p = entry->next();      entry->set_next(free_list);      free_list = entry;     }    }   } }

通过上面的代码,我们可以直观了解到,对 JVM (Sun JDK 1.4.2) 来说,String.intern 提供的是全局性的基于哈希表的共享支持。这样的实现虽然简单,并能够在最大限度上进行字符串共享;但同时也存在共享粒度太大,优化效果无法度量,大量字符串可能导致全局字符串表性能降低等问题。

为此 Eclipse 舍弃了 JVM 一级的字符串共享优化机制,而通过提供细粒度、完全可控、可测量的字符串分区共享优化机制,一定程度上缓解此问题。Eclipse 核心的 IStringPoolParticipant 接口由使用者显式实现,在其 shareStrings 方法中提交需要共享的字符串。

代码:

// // org.eclipse.core.runtime.IStringPoolParticipant // public interface IStringPoolParticipant {   /**   * Instructs this participant to share its strings in the provided   * pool.   */   public void shareStrings(StringPool pool); }

例如 MarkerInfo 类型实现了 IStringPoolParticipant 接口,在其 shareStrings 方法中,提交自己需要共享的字符串 type,并通知其下级节点进行相应的提交。

代码:

// // org.eclipse.core.internal.resources.MarkerInfo // public class MarkerInfo implements ..., IStringPoolParticipant {   public void shareStrings(StringPool set) {    type = set.add(type);    Map map = attributes;    if (map instanceof IStringPoolParticipant)    ((IStringPoolParticipant) map).shareStrings(set);   } }

Eclipse的字符串分区共享优化机制(3)

时间:2011-01-03

这样一来,只要一个对象树各级节点选择性实现 IStringPoolParticipant 接口,就可以一次性将所有需要共享的字符串,通过递归提交到一个字符串缓冲池中进行复用优化。如 Workspace 就是这样一个字符串共享根入口,其 open 方法在完成工作区打开操作后,将需要进行字符串共享优化的缓存管理对象,加入到全局字符串缓冲区分区优化列表中。

代码:

// // org.eclipse.core.internal.resources // public class Workspace ... {   protected SaveManager saveManager;   public IStatus open(IProgressMonitor monitor) throws CoreException   {    // 打开工作空间    // 最终注册一个新的字符串缓冲池分区    InternalPlatform.getDefault().addStringPoolParticipant(saveManager, getRoot());    return Status.OK_STATUS;   } }

对需要优化的类型 SaveManager 来说,只需要实现 IStringPoolParticipant 接口,并在被调用的时候提交自己与子元素的需优化字符串即可。其子元素甚至都不需要实现 IStringPoolParticipant 接口,只需将提交行为一级一级传递下去即可,如:

代码:

// // org.eclipse.core.internal.resources.SaveManager // public class SaveManager implements ..., IStringPoolParticipant {   protected ElementTree lastSnap;   public void shareStrings(StringPool pool)   {    last

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号