用Runtime Spy调解Eclipse的启念头能,第1部门 – 开始
副标题#e#
我们险些天天城市传闻有新的公司选用 Eclipse 作为他们的应用措施开拓平 台。尽量所有这些公司的产物(更不消说所有的 Eclipse 组织成员公司的产物 了)的安装配置大概是正在趋于沟通,可是内存利用过多和机能下降的风险照旧 很大。本文先容了一个很是有用却鲜为人知的东西,Runtime Spy,来辅佐插件开拓者。Runtime Spy 透视图是焦点团队(Core team)的侦探和东西(Spies and Tools)小组的一部门。
留意:焦点东西只能运行于 Eclipse 版本 2.x。在本文颁发时,它们还不能 运行于 Eclipse 3.0 驱动措施上;编号为 47518 的 bug 描写了这一问题。
为什么 Eclipse 需要快速启动
Eclipse 的体系布局是为了在运行期发明其情况的扩展而设计的。这种体系 布局化扩展本领让许多东西可以无缝地集成到 Eclipse 中。Eclipse 架构师在 项目早期就意识到,这些扩展不能在客户机代码中以措施节制的方法界说,因为 当 Eclipse 集成了越来越多的扩展后,累积的启动开销将变得无法接管。从而 ,这些扩展由 插件 界说。
为了在保持机动性的同时制止启动开销,插件静态地将它的扩展界说在一个 清单文件(manifest file)中。插件清单界说了足够的信息,使 Eclipse 平台 可以延迟加载代码,同时仍可以识别扩展的初始影响。譬喻,用户界面扩展点需 要足够的信息来描画初始的用户界面元素(譬喻,所提供的东西条按钮的图标和 热区提示(tooltip)文本),这样平台可以推迟插件代码的加载,直到用户真 正选择一个菜单选项、选择一个东西条按钮、打开一个属性页可能启动某个领导 时才加载。插件的最初开销只是对其清单的理会。XML 名目标理会很快,功效保 存到磁盘,下次还可再用,这样,当界说了新的插件可能扩展时,启动不会受到 显著影响。不外,有一些要了解无意中让这种长处失效,从而增加了启动时间和 内存耗损。
幸运的是,Eclipse 插件开拓者可以利用 Runtime Spy 透视图来辅佐追踪这 些问题。本文先容了焦点东西插件和它的 Runtime Spy,并先容了 readme 文件 内容之外的对其实用东西的一些零星描写。
安装焦点东西
安装很简朴。只需要下载焦点东西压缩包并解压缩到您的 <inst_dir>\eclipse\plugins 目次。接下来抉择您是不是但愿侦探您的 底层 Eclipse 设施(利用 -debug 呼吁行选项),可能是不是但愿侦探您的运 行期事情台(利用它的启动设置的 Tracing 页。我们将在“ 侦探运行期事情台 ”回到这一话题)。此刻让我们来看第一个选择:侦探您的底层 Eclipse 设施 。
首先,从 plugins\org.eclipse.core.tools_1.0.2 子目次下拷贝 .options 文件到您的 <inst_dir>\eclipse 目次来,以启用所有可用的 Spy 选项 。这将启用除了类监督以外的所有选项。要监督类的加载,您必需在 plugins\org.eclipse.core.boot_1.0.2\trace.properties 文件中列出包括您 所感乐趣的类的包可能插件。在“ 查察插件的哪些类被加载”部门我们再向您 先容如何指定这些内容。
然后启动 Eclipse,不要健忘指定 -debug 呼吁行选项,这会去读位于 <inst_dir>\eclipse 目次下 .options 文件。另一种要领,您可以将 .option 文件地址的位置标识为 -debug 选项的一个参数(譬喻, -debug file:d:\…\.options )。
侦探事情台
我们假定您已经安装了焦点东西文件,并从头启动了 Eclipse。由于已经指 定了 -debug 呼吁行参数,您将会看到定向到尺度输出的一些启动动静。当处于 调试模式时,这些将显示在一个单独的呼吁提示窗口中,如图 1 所示。
图 1. 对 -debug 选项的指定打开了一个显示尺度输出动静的呼吁提示窗口
既然每个 Runtime Spy 的视图都已经启动并运行,让我们来快速欣赏一下这 些视图。不要健忘,Spy 作为“spied”插件在同一个事情台中运行,因此在使 用东西自己的正常进程中大概会有一些插件被激活。这凡是不要紧,因为它只是 用到了底层的成果,而这些成果应该已经加载可能迟早都得加载。有一种环境未 必会呈现,但确实重要,那就是别忘了它的视图只是按照需要而更新,所以 Runtime Spy 透视图第一次打开时,它将只显示出在它本身启动之 前 就已经在 运行的那些插件。
查察哪些插件在运行
选择 Window > Open Perspective > Runtime Spy打开四个视图,如 图 2 所示。
图 2. Runtime Spy 透视图由 Activated Plugins、Loaded Classes、 Plugin Datasheet 和 Stack Trace 视图构成
#p#副标题#e#
#p#分页标题#e#
假如您健忘了指定 -debug 选项,您将看到 Activated Plugins视图中显示 出“Plugin monitoring is not enabled”动静。由于默认没有类在被监督,因 此 Loaded Classes视图将包括“Class monitoring is not enabled”动静。捕 获类加载信息会使 Eclipse 变慢,因此您必需通过指定包括您所感乐趣的类的 包或插件来列出那些类。此刻我们只是体贴哪些插件被加载了。图 3 显示了 Runtime Spy 的主要视图, Activated Plugins。
图 3. Runtime Spy 中显示的 Activated Plugins 视图
假如您但愿在 Runtime Spy 视图中显示内存利用率统计( Alloc、 Used和 Rom Used列),您必需用支持 J9 技能的 IBM Java 运行期情况(Runtime Environment)。这个 JRE 包括在名为 WebSphere Studio Workbench 的 IBM 版本 Eclipse 中,您在 IBM PartnerWorld for Developers 注册后就可以免费 下载获得它。记着将 J9 指定为 Java 运行期情况的一个参数(譬喻, eclipse -debug -vmargs -Xj9 )。
点击第一列的标题, Plugin,将排序改为升序、降序和分组升序。在“+” 号之下分组的插件是父插件运行的时候需要运行的那些插件。当加载的插件被分 组的时候,行的值对应于插件以及它所有子插件。当您想要将重量级(资源)消 耗者以一个组来查察时,可以利用这种排序。
后头跟有一个星号的插件名是那些在启动的时候就加载的插件。不管名字意 味着什么,Activated Plugins 视图中标志了星号的启动插件荟萃里,并不包罗 事情台处理惩罚其 org.eclipse.ui.startup 扩展点时加载的那些插件。更确切地说 ,事情台是在初始启动今后才处理惩罚这些扩展的部门。
出格有趣的是 Order 列。点击这一列的标题,将插件列表以加载顺序排序。 假如您但愿快速查察给定的行动激活了哪个插件,先选中所有的插件(Ctrl+A) ,执行谁人行动,再回到 Activated Plugins 视图,然后选择 按钮。没有被选中的就是那些刚被激活的插件。别的一种要领是,记 录下在您的行动之前已经在运行的最后一个插件的序号值,然后更新,来查察那 些排序更高的插件。
查察插件的哪些类被加载
插件的类是按需要加载的。通过延迟这些引用可能淘汰对一些类的引用,您 有大概会节省内存和启动时间。Loaded Classes 视图将帮您查察所选择的插件 到此刻为止哪些类已经被加载了。要更新 Loaded Classes 视图,在 Activated Plugin 列表中选择一个或多个插件,然后选择 按钮。图 4 中显示的是 org.eclipse.jdt.core 插件已加载的类, 以加载顺序排序。
图 4. Runtime Spy 中显示的 Loaded Classes 视图
除了插件激活序次外,我发明,通过对引用序次举办排序,这个视图还可以 用来获得一个给定行动所初始化的类和序列的“整体图(big picture)”。这 个列表中包罗了插件启动代码,让您充实认识到执行它的价钱。这个故事的寓意 凡是是“启动时做的太多了”。
追踪一个类为什么被加载
要更清楚地相识是什么导致了一个插件的激活可能一个类的加载,首先您必 须为引起您存眷的类地址的插件可能包启用追踪选项。在这个例子中,我建设了 一个 traces.properties 文件,个中一行为 packages=org.eclipse.jface.text 。然后您需要:
在 Activated Plugins 列表中选择 org.eclipse.jface.text 插件。
按下 按钮以更新 Loaded Classes 列表。
选择 org.eclipse.jface.text.ITextViewer 类。
选择 按钮来更新 Stack Trace 视图。
这将显示出哪些代码让类加载器加载了谁人类(假如在这之前它还没有被加 载)并激活了选中的插件,如图 5 所示。
图 5. Runtime Spy 中显示的 Stack Trace 视图
栈顶凡是不值得存眷,因为那追踪的是类加载器代码自己。有用的信息在中 下部。在这个例子中,栈记录显示,是由于 Runtime Spy 透视图的打开而最终 导致了 ITextViewer 类的加载,如高亮的栈记录行底部所示。透视图打开的初 始化视图中包罗 Plugin Datasheet 视图,这个视图将用 JFace Text 类 TextViewer 来显示它的数据。在 defineClass 期间核实谁人类时,JVM 发明还 需要 ITextViewer ,因为 TextViewer 实现的是这一接口。如您可以看到的, JVM 运行期的类加载可以嵌套得相当深;出于机能目标您凡是应该存眷那些引起 类加载器挪用的代码,像图 5 中显示的栈记录的高亮部门。
追踪插件为什么被加载
#p#分页标题#e#
上一个例子说明白一个特定类为什么会被加载。您还可以查察一个给定的插 件为什么被加载,可是插件的激活原因看起来不是那么明明,因为起因是间接的 。一般环境下,类是由于被另一个类的要领引用而被加载(而且您还可以参考相 应的 import 语句),与之差异,插件的加载是一些间接引用的功效。不要健忘 ,我们的目标是,不到插件被用到的时候只管不去加载它,所以对插件自己的引 用这样实现:
显示地声明标识,好比插件清单中的 <import plugin="org.eclipse.ui"> ,可能
隐式地标识,好比为谁人插件导出包到运行期 JAR 中。
这两个例子都在“Hello, Eclipse”插件清单节选中突出显示了,见清单 1 。
清单 1. “Hello, Eclipse”的扩展点样例
<?xml version="1.0" encoding="UTF-8"?>
<plugin ...>
... lines omitted ...
<runtime>
<library name="hello.jar"/>
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
</requires>
... lines omitted ...
<extension point="org.eclipse.ui.actionSets">
<actionSet
label="Sample Action Set"
visible="true"
id="hello.actionSet">
<menu
label="Sample &Menu"
id="sampleMenu">
<separator
name="sampleGroup">
</separator>
</menu>
<action
label="&Sample Action"
icon="icons/sample.gif"
class="hello.actions.SampleAction"
tooltip="Hello, Eclipse world"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup" id="hello.actions.SampleAction">
</action>
</actionSet>
</extension>
对 org.eclipse.ui.actionSets 扩展点行动配置的孝敬隐式地依赖于界说插 件,即 Workbench UI 插件(org.eclipse.ui)。Workbench 插件会去读取插件 注册表,哪里包括了对它的 org.eclipse.ui.actionSets 扩展的这一孝敬,并 建设相应的行动配置。SampleAction 类将不会在这里被加载,因此包括它的插 件也不会被加载。取而代之的是,Workbench 插件界说了一个委派行动来代表用 户界面中的选择,这个委派行动会期待,直到用户真正选择它才建设 SampleAction 的一个实例来处理惩罚响应。
为建设 SampleAction 的一个实例,行动代表(action delegate)挪用插件 注册表实例 IConfigurationElement 的 createExecutableExtension 要领,对 应于我们的例子清单文件中指定的 <action class="hello.actions.SampleAction" …> 标签。固然那样不错,可是有 时在栈记录功效中不容易看出来。让我们来仔细看一个比“Hello, Eclipse”按 钮选择更难的例子。图 6 显示了一个由可执行扩展处理惩罚而导致的典范(插件) 激活。此刻让我们用 Stack Trace 视图来确定其原因,步调同前。
图 6. Stack Trace 视图显示了可执行扩展的启动
在这个例子中,我们从栈记录高亮部门的底部可以看出,这些都是源于 PDE 的 Plug-ins 视图中的一次双击。默认的行动处理惩罚者认真处理惩罚请求 Workbench 打开 Plug-in Manifest 编辑器的行动,随后激活 org.eclipse.ui.editors 插 件。栈记录的高亮部门只是显示了扩展点处理惩罚器的代码,因为它对 Workbench 插件类 (org.eclipse.ui) 的引用是间接的。通过六次雷同的栈记录,您将识别 出对 IConfigurationElement.createExecutableExtension 挪用前后重要的部 分,并很快看出是谁启动了它以及功效是什么。您可以再次选择 按钮来更新加载的类并从头按加载顺序排序,以更好地相识插件启动 后产生了什么工作。
其他有用的视图
最后, Plugin Datasheet视图总结了一些有趣的统计数据,譬喻插件界说了 几多资源和扩展,如图 7 所示。
图 7. Plugin Datasheet 显示被利用的资源
#p#分页标题#e#
这个视图追踪了由 IPluginDescriptor.getResourceString 要领及其变量加 载的资源束(resource bundle)数据。这一总结信息得益于这样一个事实,即 Eclipse 平台运行期有其本身的类加载器,而且类加载器像处理惩罚类一样处理惩罚资源 束,因此保持对资源数据统计的追踪很简朴。“not loaded yet”动静暗示实际 上插件注册表写到了磁盘上,它所引用的部门只是在需要的时候才加载。
侦探运行期事情台
前一节先容了侦探 Eclipse 自己的底层设施。更实际的是,您会但愿侦探测 试版事情台,称为 运行期事情台。您可以选择 Run > Run As… > Run -time Workbench并转到 Tracing 页,来设置您但愿启动的运行期事情台的实例 ,如图 8 所示。
图 8. 在 Tracing 页中配置 Runtime Spy 选项
org.eclipse.core.boot 插件的调试选项也位于我们前面接头的 <inst_dir>\eclipse\plugins\org.eclipse.core.boot_2.1.1\.options 文件选择中。这个文件界说了您险些必定会期望的默认值 (每个都打开)。不 过,假如您想对所用的时间举办较量准确的机能丈量,那么您应该将启用的选项 淘汰到最少,尤其是需要利用栈记录的那些(即 trace/pluginactivation 等) 。将 monitor/plugins 配置为 true,其他都配置为 false,这样带来的机能开 销很少。
其他信息
您可以找到许多关于 Java 机能调解的资料,可是很少是专门针对 Eclipse 的。本文向您先容的东西是用来领略和诊断插件运行相关的启念头能问题最好的 东西之一。竣事之前,有须要存眷焦点东西向您提供的一些其他有用的诊断信息 :
Plug-in Dependency透视图显示的信息与 Plug-in Registry视图中显示的信 息雷同(通过 Window > Show View > Other… > PDE Runtime > Plug-in Registry挪用),可是带有一个关于选中插件所依赖插件的详尽列表。
思量过事情空间(Workspace)的 .metadata 目次中有什么内容吗? Metadata透视图将帮您在它的布局中周游。不外前提是得对事情空间实现有相当 深入的领略。
一类 Resource Tools视图描写的是对资源改变监听措施和 resource delta 、builder 等等的洞察。那些进修事情空间 API 的人尤其应该留意 Resource、 Delta和 Builder/Listener视图。选择 Window > Show View > Other… > Resource Tools来会见这些视图。
您可以在焦点东西的 readme 中进一步相识这些东西。
本系列文章的第 2 部门将向您先容我是如何利用 Runtime Spy 来诊断 WebSphere Studio Application Developer 版本 5.1.1 的几个启动问题的。其 后,取决于运行的视图和透视图,启念头能提高了 11% 到 37%,这就证明,对 您的插件何时被激活及被激活的原因的领略,可以辅佐实现 Eclipse 的快速启 动。
期待 WebSphere Studio 版本 6.0 吧,我们将 真正提高启念头能!