flash.samplerStackFrame 通过 StackFrame 类可以访问包含函数的数据块的属性。Object 通过 StackFrame 类可以访问包含函数的数据块的属性。仅适用于 Flash Player 调试器版。 toString 将 StackFrame 转换为其属性的字符串。一个字符串,其中包含 StackFrame 对象的 name 属性以及(可选)fileline 属性(如果正在调试 SWF 文件)。仅适用于 Flash Player 调试器版。 String 将 StackFrame 转换为其属性的字符串。 file 所调试的 SWF 文件的文件名。String 所调试的 SWF 文件的文件名。仅适用于 Flash Player 调试器版。 line 所调试的 SWF 文件中的函数的行号。uint 所调试的 SWF 文件中的函数的行号。仅适用于 Flash Player 调试器版。 name 堆栈帧中的函数名称。String 堆栈帧中的函数名称。仅适用于 Flash Player 调试器版。 scriptID 正在进行配置处理的应用程序中脚本函数的标识符。Number 正在进行配置处理的应用程序中脚本函数的标识符。 NewObjectSample NewObjectSample 类表示在 getSamples() 流中创建的对象。flash.sampler:Sample NewObjectSample 类表示在 getSamples() 流中创建的对象。仅适用于 Flash Player 调试器版。 下面的示例使用 Sample 对象 sstacktime 属性来收集内存样本。该样本包含 NewObjectSample 对象(newSamples 数组)、DeleteObjectSample 对象(delSamples 数组)和 CPU 内存样本对象(cpuSamples 数组)。为了使用内存设置,需要安装 Flash Player 调试器版 9.0.115.0 或更高版本。 package { import flash.sampler.* import flash.system.* import flash.utils.* import flash.display.Sprite public class sampleTypes extends Sprite { var b:Boolean = true public function sampleTypes() { flash.sampler.startSampling(); for(var i:int=0;i<10000;i++) new Object(); var cpuSamples:Array=[]; var newSamples:Array=[]; var delSamples:Array=[]; var ids:Array=[] var lastTime:Number=0; for each(var s:Sample in getSamples()) { assert(s.time > 0); // positive assert(Math.floor(s.time) == s.time, s.time); // integral assert(s.time >= lastTime, s.time + ":" + lastTime); // ascending assert(s.stack == null || s.stack is Array) if(s.stack) { assert(s.stack[0] is StackFrame); assert(s.stack[0].name is String); } if(s is NewObjectSample) { var nos = NewObjectSample(s); assert(s.id > 0, s.id); assert(s.type is Class, getQualifiedClassName(s.type)); newSamples.push(s); ids[s.id] = "got one"; } else if(s is DeleteObjectSample) { var dos = DeleteObjectSample(s); delSamples.push(s); assert(ids[dos.id] == "got one"); } else if(s is Sample) cpuSamples.push(s); else { assert(false); } lastTime = s.time; } trace(b) trace(newSamples.length > 0) trace(cpuSamples.length > 0) trace(delSamples.length > 0) } private function assert(e:Boolean, mess:String=null):void { b = e && b; if(true && !e) { if(mess) trace(mess); trace(new Error().getStackTrace()); } } } } flash.sampler.getSamples()type 与 getSamples() 流中创建的对象相对应的 Class 对象。ClassgetSamples() 流中创建的对象相对应的 Class 对象。仅适用于 Flash Player 调试器版。 object NewObjectSample 对象(如果仍存在)。 NewObjectSample 对象(如果仍存在)。如果已将该对象作为垃圾回收,则此属性是未定义的并存在对应的 DeleteObjectSample。仅适用于 Flash Player 调试器版。 flash.sampler.DeleteObjectSamplesize NewObjectSample 对象大小。Number NewObjectSample 对象大小。如果已将该对象作为垃圾回收,则此属性是未定义的并存在对应的 DeleteObjectSample。仅适用于 FlashPlayer 调试版。 flash.sampler.DeleteObjectSampleclearSamples 清除当前的 Sample 对象集合。 清除当前的 Sample 对象集合。通常在调用 getSamples() 并遍历 Sample 对象后调用此方法。仅适用于 Flash Player 调试器版。 getSamples()getGetterInvocationCount 返回 get 函数的执行次数。get 函数的执行次数。 NumberobjObject方法实例或类。 qnameQName如果 qname 为 undefined,则返回构造函数的迭代次数。 返回 get 函数的执行次数。在使用 getGetterInvocationCount() 之前使用 isGetterSetter() 验证是否具有 get/set 函数。仅适用于 Flash Player 调试器版。 isGetterSetter()getInvocationCount()getInvocationCount 返回方法的执行次数。方法的执行次数。 NumberobjObject方法实例或类。在方法实例不可用时,可以使用类来获取实例函数的调用计数。如果 objundefined,则此方法返回由 qname 命名的范围限于包的函数计数。 qnameQName如果 qname 为 undefined,则返回构造函数的迭代次数。 返回方法的执行次数。如果参数 obj 为类并且参数 qnameundefined,则此方法返回构造函数的迭代次数。仅适用于 Flash Player 调试器版。 package { public function exec3() {} import flash.sampler.*; import flash.system.*; import flash.display.Sprite; import flash.utils.*; public class getInvocationCountTest extends Sprite { public function getInvocationCountTest() { for(var i:int=0;i<10;i++) exec(); for(var i:int=0;i<10;i++) exec2(); for(var i:int=0;i<10;i++) exec3(); // get exec QName var execName:QName; var name:QName; var fooName:QName; for each(name in getMemberNames(this)) { if(name.localName == "exec") execName = name; if(name.localName == "foo") fooName = name; } var exec2Name:QName; for each(name in getMemberNames(getInvocationCountTest)) { if(name.localName == "exec2") exec2Name = name; } // execute get/set foo = "bar"; trace(isGetterSetter(this, fooName)); trace(getSetterInvocationCount(this, fooName) == 1); trace(getGetterInvocationCount(this, fooName) == 0); foo; trace(getSetterInvocationCount(getInvocationCountTest, fooName) == 1); trace(getGetterInvocationCount(getInvocationCountTest, fooName) == 1); trace(getInvocationCount(this, execName) == 10); trace(getInvocationCount(getInvocationCountTest, execName) == 10); trace(getInvocationCount(getInvocationCountTest, exec2Name) == 10); trace(getInvocationCount(getInvocationCountTest, undefined) == 1); getTimer(); getTimer(); trace(getInvocationCount(undefined, new QName("", "trace")) == 9); trace(getInvocationCount(undefined, new QName("flash.utils", "getTimer")) == 2); trace(getInvocationCount(undefined, new QName("", "exec3")) == 10); } private function exec():void {} private static function exec2():void {} private function get foo():String { return "fo"; } private function set foo(s:String) { } } } getLexicalScopes 显示 Function 的词汇范围,以使捕获范围的对象(包括激活对象以及范围内对象)在被 Function 实例保留时对于分析器可见。包含所有词汇范围元素的数组 ArrayobjFunction一个函数 显示 Function 的词汇范围,以使捕获范围的对象(包括激活对象以及范围内对象)在被 Function 实例保留时对于分析器可见。 getMasterString 返回此字符串所关联的主字符串,或者如果此字符串不与其他字符串关联,则返回 null。传入字符串所关联的字符串,或者如果传入字符串不与其他字符串关联,则为 null。 StringstrString字符串 返回此字符串所关联的主字符串,或者如果此字符串不与其他字符串关联,则返回 null。例如,如果调用 String.substr(),出于效率考虑,返回的字符串常常仅作为一个指针,实际实现到原始字符串中。通常使用过程中,这些实现细节对于用户是不可见的;但是,在使用分析器分析程序的内存占用时,可能会出现令人困惑的情形,因为此字符串可能显示为所占用的内存比字符串值所需要的内存要少。此外,字符串可能单独保存在内存中,因为它是其他字符串的主字符串。getMasterString() 可使分析器向用户显示字符串相关性的准确图表。 getMemberNames 返回一个对象,其中包含指定对象的所有成员(包括私有成员)。一个对象,必须使用 for each..in 循环进行遍历以检索每个属性的 QName。 ObjectoObject要分析的对象。 instanceNamesBooleanfalse如果对象是类并且 instanceNames 为 true,则将 o 视为类的实例来报告实例名称而不是类的成员名称。 返回一个对象,其中包含指定对象的所有成员(包括私有成员)。然后可以遍历返回的对象以查看所有的值。此方法与 flash.utils.describeType() 方法类似,不过使用它还可以查看私有成员并跳过创建 XML 对象的中间步骤。仅适用于 Flash Player 调试器版。 以下示例使用 getMemberNames() 方法分析对象并显示其成员的 buttonModefiltersdispatchEvent 属性。为了使用内存设置,需要安装 Flash Player 调试器 9.0.115.0 或更高版本。 package { import flash.sampler.*; import flash.system.*; import flash.display.Sprite; public class getMemberNamesTest extends Sprite { public function getMemberNamesTest() { var name_iter = getMemberNames(this); var o={}; for each(var name:QName in name_iter) { o[name.localName] = "got it"; } name_iter = getMemberNames(this); var count=0; for(var dum in name_iter) { count++; } trace(count == 1); // my member trace("buttonMode" in o); // inherited member trace("filters" in o); // inherited function trace("dispatchEvent" in o); var name_iter = getMemberNames(getMemberNamesTest, true); var o={}; for each(var name:QName in name_iter) { o[name.localName] = "got it"; } // my member trace("buttonMode" in o); // inherited member trace("filters" in o); // inherited function trace("dispatchEvent" in o); } } } flash.utils.describeType()for each..ingetSampleCount 返回收集的样本数。Sample 实例的迭代器。 Number 返回收集的样本数。仅适用于 Flash Player 调试器版。 flash.sampler.SamplegetSamples 从上次采样会话中返回内存使用 Sample 实例的对象。Sample 实例的迭代器。 Object 从上次采样会话中返回内存使用 Sample 实例的对象。仅适用于 Flash Player 调试器版。 flash.sampler.SamplegetSavedThis 从 closure 方法返回保存的“this”,通常无法从 AS 看到。MethodClosure 的“this”对象 ObjectobjFunction一个 MethodClosure 实例 从 closure 方法返回保存的“this”,通常无法从 AS 看到。 getSetterInvocationCount 返回 set 函数的执行次数。set 方法的执行次数。 NumberobjObject方法实例或类。 qnameQName如果 qname 为 undefined,则返回构造函数的迭代次数。 返回 set 函数的执行次数。在使用 getSetterInvocationCount() 之前使用 isGetterSetter() 验证是否具有 get/set 函数。仅适用于 Flash Player 调试器版。 isGetterSetter()getInvocationCount()getSize 当所指定对象用于 Flash Player 9.0.115.0 或更高调试器版本时,返回该对象所占用的内存大小。指定对象使用的内存字节计数。 Numbero要分析其内存使用量的对象。 当所指定对象用于 Flash Player 9.0.115.0 或更高调试器版本时,返回该对象所占用的内存大小。如果与非调试器版的 Flash Player 一起使用,则此方法返回 0 下面的示例使用 startSampling()pauseSampling 收集 Sample 对象。然后,示例针对 id 值和大小遍历 Sample 对象。在调用 System.gc() 停止当前过程后,示例将 deletedObjectSample 对象与原始 id 值进行比较并显示它们的大小。为了使用内存设置,需要安装 Flash Player 调试器版 9.0.115.0 或更高版本。 package { import flash.sampler.*; import flash.system.*; import flash.display.Sprite; import flash.utils.Dictionary; public class deletedObjectSize extends Sprite { public function deletedObjectSize() { startSampling(); var obj = {}; pauseSampling(); var id:Number; var sampleIter = getSamples(); for each(var s:Sample in sampleIter) { id = s.id; } sampleIter = getSamples(); var count=0; for(var dum in sampleIter) { count++; } trace(count == 1); var size:Number = getSize(obj); obj = undefined; startSampling(); // force DRC for(var i:int=0;i<1000;i++) new Object(); System.gc(); pauseSampling(); var sampleIter = getSamples(); for each(var s:Sample in sampleIter) { // trace(s); if(s is DeleteObjectSample && s.id == id) { trace(s.size == size); } } } } } isGetterSetter 检查以确定 get/set 函数是否定义了属性。一个布尔值,表示 get/set 函数是否定义了该属性;如果是,则为 true,否则为 falseBooleanobjObject方法实例或类。 qnameQName如果 qname 为 undefined,则返回构造函数的迭代次数。 检查以确定 get/set 函数是否定义了属性。如果要对某一属性的 get/set 函数使用 getInvocationCount(),请首先调用 isGetterSetter() 以检查它是否为 get/set 函数,然后使用 getSetterInvocationCountgetGetterInvocationCount 来获取各自的计数。仅适用于 Flash Player 调试器版。 package { public function exec3() {} import flash.sampler.*; import flash.system.*; import flash.display.Sprite; import flash.utils.*; public class getInvocationCountTest extends Sprite { public function getInvocationCountTest() { for(var i:int=0;i<10;i++) exec(); for(var i:int=0;i<10;i++) exec2(); for(var i:int=0;i<10;i++) exec3(); // get exec QName var execName:QName; var name:QName; var fooName:QName; for each(name in getMemberNames(this)) { if(name.localName == "exec") execName = name; if(name.localName == "foo") fooName = name; } var exec2Name:QName; for each(name in getMemberNames(getInvocationCountTest)) { if(name.localName == "exec2") exec2Name = name; } // execute get/set foo = "bar"; trace(isGetterSetter(this, fooName)); trace(getSetterInvocationCount(this, fooName) == 1); trace(getGetterInvocationCount(this, fooName) == 0); foo; trace(getSetterInvocationCount(getInvocationCountTest, fooName) == 1); trace(getGetterInvocationCount(getInvocationCountTest, fooName) == 1); trace(getInvocationCount(this, execName) == 10); trace(getInvocationCount(getInvocationCountTest, execName) == 10); trace(getInvocationCount(getInvocationCountTest, exec2Name) == 10); trace(getInvocationCount(getInvocationCountTest, undefined) == 1); getTimer(); getTimer(); trace(getInvocationCount(undefined, new QName("", "trace")) == 9); trace(getInvocationCount(undefined, new QName("flash.utils", "getTimer")) == 2); trace(getInvocationCount(undefined, new QName("", "exec3")) == 10); } private function exec():void {} private static function exec2():void {} private function get foo():String { return "fo"; } private function set foo(s:String) { } } } getInvocationCount()getSetterInvocationCount()getGetterInvocationCount()pauseSampling 立即停止采样过程。 立即停止采样过程。使用 startSampling() 重新启动采样过程。仅适用于 Flash Player 调试器版。 startSampling()sampleInternalAllocs 如果应该为来自 Flash Player 的内部分配创建 NewObjectSamples,则告知取样器。bBoolean 如果应该为来自 Flash Player 的内部分配创建 NewObjectSamples,则告知取样器。如果设置为 true,则各个分配都将生成一个 NewObjectSample。这些内部分配将不包含类型或对对象的引用。它们将包含触发分配的 ActionScript 堆栈。默认值为 false,这将只收集对 ActionScript 对象的分配。 setSamplerCallback 为取样器设置回调函数 - 在示例流将要用尽时调用此函数。fFunction 为取样器设置回调函数 - 在示例流将要用尽时调用此函数。这应用于在填充样本缓冲区之前处理样本。将在调用回调之前调用 pauseSampling 并在执行回调之后调用 startSampling。 startSampling 开始收集内存使用 Sample 对象的过程。 开始收集内存使用 Sample 对象的过程。仅适用于 Flash Player 调试器版。 下面的示例启动采样过程并遍历收集的对象。为了使用内存设置,需要安装 Flash Player 调试器版 9.0.115.0 或更高版本。 package { import flash.sampler.* import flash.system.* import flash.display.Sprite public class startSampling extends Sprite { public function startSampling() { flash.sampler.startSampling(); for(var i:int=0;i<1000;i++) new Object() trace(getSampleCount() > 0) } } } Sample 类stopSampling 结束收集内存使用 Sample 对象的过程,并释放采样过程的专用资源。 结束收集内存使用 Sample 对象的过程,并释放采样过程的专用资源。使用 startSampling() 启动采样过程。仅适用于 Flash Player 调试器版。 Sample 类Sample Sample 类创建一些对象,它们保存不同时段的内存分析信息。Object Sample 类创建一些对象,它们保存不同时段的内存分析信息。仅适用于 Flash Player 调试器版。 下面的示例使用 Sample 对象 sstacktime 属性来收集内存样本。该样本包含 NewObjectSample 对象(newSamples 数组)、DeleteObjectSample 对象(delSamples 数组)和 CPU 内存样本对象(cpuSamples 数组)。为了使用内存设置,需要安装 Flash Player 调试器版 9.0.115.0 或更高版本。 package { import flash.sampler.* import flash.system.* import flash.utils.* import flash.display.Sprite public class sampleTypes extends Sprite { var b:Boolean = true public function sampleTypes() { flash.sampler.startSampling(); for(var i:int=0;i<10000;i++) new Object(); var cpuSamples:Array=[]; var newSamples:Array=[]; var delSamples:Array=[]; var ids:Array=[] var lastTime:Number=0; for each(var s:Sample in getSamples()) { assert(s.time > 0); // positive assert(Math.floor(s.time) == s.time, s.time); // integral assert(s.time >= lastTime, s.time + ":" + lastTime); // ascending assert(s.stack == null || s.stack is Array) if(s.stack) { assert(s.stack[0] is StackFrame); assert(s.stack[0].name is String); } if(s is NewObjectSample) { var nos = NewObjectSample(s); assert(s.id > 0, s.id); assert(s.type is Class, getQualifiedClassName(s.type)); newSamples.push(s); ids[s.id] = "got one"; } else if(s is DeleteObjectSample) { var dos = DeleteObjectSample(s); delSamples.push(s); assert(ids[dos.id] == "got one"); } else if(s is Sample) cpuSamples.push(s); else { assert(false); } lastTime = s.time; } trace(b) trace(newSamples.length > 0) trace(cpuSamples.length > 0) trace(delSamples.length > 0) } private function assert(e:Boolean, mess:String=null):void { b = e && b; if(true && !e) { if(mess) trace(mess); trace(new Error().getStackTrace()); } } } } flash.sampler.getSamples()stack 包含 Flash Player 在指定时段执行的方法的相关信息。Array 包含 Flash Player 在指定时段执行的方法的相关信息。堆栈跟踪的格式与 Flash Player 调试器版的异常对话框中显示的内容类似。仅适用于 Flash Player 调试器版。 time 定义 Sample 实例持续时间的微秒数。Number 定义 Sample 实例持续时间的微秒数。仅适用于 Flash Player 调试器版。 DeleteObjectSample DeleteObjectSample 类表示在 getSamples() 流中创建的对象;每个 DeleteObjectSample 对象与一个 NewObjectSample 对象相对应。flash.sampler:Sample DeleteObjectSample 类表示在 getSamples() 流中创建的对象;每个 DeleteObjectSample 对象与一个 NewObjectSample 对象相对应。仅适用于 Flash Player 调试器版。 下面的示例使用 Sample 对象 sstacktime 属性来收集内存样本。该样本包含 NewObjectSample 对象(newSamples 数组)、DeleteObjectSample 对象(delSamples 数组)和 CPU 内存样本对象(cpuSamples 数组)。为了使用内存设置,需要安装 Flash Player 调试器版 9.0.115.0 或更高版本。 package { import flash.sampler.* import flash.system.* import flash.utils.* import flash.display.Sprite public class sampleTypes extends Sprite { var b:Boolean = true public function sampleTypes() { flash.sampler.startSampling(); for(var i:int=0;i<10000;i++) new Object(); var cpuSamples:Array=[]; var newSamples:Array=[]; var delSamples:Array=[]; var ids:Array=[] var lastTime:Number=0; for each(var s:Sample in getSamples()) { assert(s.time > 0); // positive assert(Math.floor(s.time) == s.time, s.time); // integral assert(s.time >= lastTime, s.time + ":" + lastTime); // ascending assert(s.stack == null || s.stack is Array) if(s.stack) { assert(s.stack[0] is StackFrame); assert(s.stack[0].name is String); } if(s is NewObjectSample) { var nos = NewObjectSample(s); assert(s.id > 0, s.id); assert(s.type is Class, getQualifiedClassName(s.type)); newSamples.push(s); ids[s.id] = "got one"; } else if(s is DeleteObjectSample) { var dos = DeleteObjectSample(s); delSamples.push(s); assert(ids[dos.id] == "got one"); } else if(s is Sample) cpuSamples.push(s); else { assert(false); } lastTime = s.time; } trace(b) trace(newSamples.length > 0) trace(cpuSamples.length > 0) trace(delSamples.length > 0) } private function assert(e:Boolean, mess:String=null):void { b = e && b; if(true && !e) { if(mess) trace(mess); trace(new Error().getStackTrace()); } } } } flash.sampler.getSamples()id 与 NewObjectSample 的标识号相匹配的唯一标识号。Number 与 NewObjectSample 的标识号相匹配的唯一标识号。仅适用于 Flash Player 调试器版。 flash.sampler.NewObjectSample.idsize DeleteObjectSample 对象在删除之前的大小。Number DeleteObjectSample 对象在删除之前的大小。仅适用于 Flash Player 调试器版。 flash.sampler.NewObjectSample.id