我刚刚通过阅读StackOverflow的一些问题和答案,意识到在C#中使用+=添加事件处理程序(或者我猜,其他.net语言)会导致常见的内存泄漏。 过去我多次使用过这样的事件处理程序,从来没有意识到它们可能导致或已经导致了我的应用程序中的内存泄漏。 这是如何工作的(意思是,为什么这会导致内存泄漏)? 我该如何解决这个问题? 正在使用-=相同的事件处理程序吗? 有处理这种情况的常见devise模式或最佳实践吗? 示例:我该如何处理具有多个不同线程的应用程序,使用许多不同的事件处理程序在UI上引发多个事件? 有没有什么好的和简单的方法在已经build成的大型应用程序中有效地进行监控?
解决了 关于这个问题,networking上有很多矛盾的信息。 感谢@John,我设法解决了closures(如下面所使用的)不是内存泄漏的原因,即使在IE8中,它们也不像人们声称的那样常见。 事实上,在我的代码中只发生了一次泄漏,事实certificate这并不难解决。 从现在起,我对这个问题的回答是: AFAIK,唯一一次IE8泄漏,是事件被附加/处理程序设置在全局对象上。 ( window.onload , window.onbeforeunload ,…)。 为了解决这个问题,请参阅下面的答案。 巨大的更新: 我现在完全失去了…经过一段时间的挖掘,新旧文章,我留下了至less一个巨大的矛盾。 虽然JavaScript大师之一(道格拉斯·克罗克福德)说: 由于IE无法完成工作并回收周期,因此我们需要这样做。 如果我们明确地打破周期,那么IE将能够回收内存。 据微软称,closures是导致内存泄漏的原因。 这当然是非常错误的,但是这会导致微软给程序员提出非常糟糕的build议,说明如何应对微软的错误。 事实certificate,很容易打破在DOM方面的周期。 在JScript方面几乎是不可能的。 正如@freakish指出,我的下面的代码片段类似于jQuery的内部工作,我觉得我的解决scheme非常安全,不会导致内存泄漏。 同时,我find了这个MSDN页面 ,其中“ Circular References with Closures ”一节对我特别感兴趣。 下图几乎是我的代码如何工作的示意图,是不是: 唯一的区别是,我没有把我的事件监听器附加到元素本身的常识。 所有相同的Douggie是非常明确的:闭包不是IE中的mem漏洞的来源。 这个矛盾让我无法确定谁是对的。 我也发现泄漏问题在IE9中也没有完全解决(无法find链接ATM)。 最后一件事 :我也学会了IE在JScript引擎之外pipe理DOM,当我根据ajax请求更改<select>元素的子元素时,这让我有点麻烦: function changeSeason(e) { var xhr,sendVal,targetID; e = e || window.event;//(IE… targetID = this.id.replace(/commonSourceFragment/,'commonTargetFragment');//fooHomeSelect -> barHomeSelect sendVal = this.options[this.selectedIndex].innerHTML.trim().substring(0,1); xhr […]
我首先学习了C#,现在我从C ++开始。 据我所知,C ++中的new操作符与C#中的不一样。 你能解释这个示例代码中的内存泄漏的原因吗? class A { … }; struct B { … }; A *object1 = new A(); B object2 = *(new B());
这是在这个SO问题上bradd larson的答案 如果添加两个断点,则应该能够debugging这些exception。 要做到这一点,去运行| 显示| 断点并创build两个全局断点(我在全局做这些断点,因为它们在我的所有应用程序中非常有用)。 第一个应该命名为“objc_exception_throw”,其位置应该是“libobjc.A.dylib”。 第二个应该是“ – [NSException raise]”,它的位置应该是“CoreFoundation”。 现在,如果您启用了断点debugging应用程序,则应该抛出这些exception。 然后,您应该能够看到在debugging器中导致exception的事件链。 现在在这个答案,我想问我如何添加位置提到?
ARC编译器收到以下警告: "performSelector may cause a leak because its selector is unknown". 这是我正在做的事情: [_controller performSelector:NSSelectorFromString(@"someMethod")]; 为什么我得到这个警告? 我知道编译器不能检查select器是否存在,但为什么会导致泄漏? 我怎样才能改变我的代码,使我不再得到这个警告?
我刚刚接受了一次采访,并被要求用Java创build内存泄漏。 毋庸置疑,我觉得自己很笨,不知道如何开始创build一个。 什么是一个例子?
这个错误是什么,为什么会发生? 05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here 05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here 05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231) 05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424) 05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239) […]
我正在调查Valgrind,以帮助改进我的C编码/debugging,当我发现它只用于Linux – 我没有其他需要或兴趣将我的操作系统移到Linux,所以我想知道是否有一个同样好的Windows程序。
我已经开发了一个Android应用程序,而我正处于一个电话应用程序开发的地步,一切似乎都运行良好,你想宣布胜利和发布,但是你知道只需要一些内存和资源泄漏在那里; Android上只有16MB的堆,而且在Android应用中显然很容易泄漏。 我一直在环顾四周,到目前为止只能挖掘'hprof'和'traceview'的信息,也没有得到很多有利的评论。 您可能在操作系统项目中遇到或开发了哪些工具或方法,并关心共享?
我正在尝试使用perfmon窗口实用程序来调试过程中的内存泄漏。 这就是perfmon如何解释术语: 工作集是此进程的工作集的当前大小(以字节为单位)。 工作集是进程中线程最近触及的一组内存页面。 如果计算机中的可用内存超过阈值,即使不在使用中,页面也会留在进程的工作集中。 当空闲内存低于阈值时,页面将从工作集中删除。 如果需要的话,在离开主存之前,他们将被软件故障切换回工作集。 虚拟字节是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。 使用虚拟地址空间不一定意味着相应地使用磁盘或主内存页面。 虚拟空间是有限的,这个过程会限制它加载库的能力。 专用字节是当前的大小,以字节为单位,该进程分配的内存不能与其他进程共享。 这些是我有的问题: 是我应该测量的私人字节,以确定这个过程是否有任何泄漏,因为它不涉及任何共享库,如果发生任何泄漏,将来自过程本身? 该进程消耗的内存总量是多少? 它是虚拟字节还是虚拟字节和工作集的总和? 私人字节,工作集和虚拟字节之间有任何关系吗? 还有没有其他工具可以更好地了解内存使用情况?