在PHP5中,是否保证为每个对象实例调用__destruct()方法? 程序中的exception可以防止这种情况发生?
我正在试着写一些与Rust的Boehm GC 绑定 。 一些背景知识:Rust被devise成高并发语言,并且这种devise的结果是能够静态地限制GC指针到它们被分配的线程中(也就是说,在线程x中分配的GC指针可以永远不会被另一个线程保持活着(或者甚至被引用)。 因此,我希望推动Boehm尽可能地利用这个performance: 线程安全的,所以我可以从多个线程分配和收集 停止尽可能less的集合(即只是当前线程),其他线程可以继续运行,因为它们不可能干扰与自己之外的GC指针相关的任何事情 优选地,完全线程化地在不同线程的GC“实例”之间不同步 1很容易,但我找不到任何2和3的设施。最重要的部分是1和2,因为我希望能够在后台运行线程,而不pipe其他线程在做什么(即使他们都分配和垃圾收集千兆字节的内存)。 (我知道THREAD_LOCAL_ALLOC & gc_thread_local.h ,但是这并不完全满足3,它只是使它更有效率,但它仍然是有效的线程间传递线程分配的指针,而我不需要那保证。)
我在.Net 4中使用了新的MemoryCache ,最大高速caching大小限制为MB(我testing了它在10到200MB之间,在1.75到8GB内存的系统上)。 我不会在对象上设置任何基于时间的过期,因为我只是将高速caching用作高性能驱动器,只要存在空间,我希望使用它。 令我惊讶的是,caching拒绝驱逐任何对象,以至于我会得到SystemOutOfMemoryexception 。 我启动了perfmon ,将我的应用程序连接到.Net CLR Memory\#Bytes In All Heaps , .Net Memory Cache 4.0和Process\Private Bytes – 实际上,内存消耗已经失控,没有caching修剪注册。 做了一些谷歌search和stackoverflowing ,下载和附加CLRProfiler ,和wham :到处驱逐! 内存保持在合理的范围内,根据我设定的内存大小限制。 在debugging模式下再次运行,不会驱逐。 CLRProfiler再次驱逐。 我终于注意到,探查器强制应用程序运行,没有并发垃圾收集 (也见有用的SO并发垃圾收集问题 )。 我在我的app.config中closures了它,果然,驱逐! 这似乎充其量只是一个荒谬的缺乏文档不说: 这只适用于非并发垃圾收集 – 虽然我的形象,因为它从ASP.NET移植,他们可能不必担心并发垃圾收集 。 那么有没有其他人看到这个? 我很想在那里得到一些其他的经验,也许还有一些更有教养的见解。 更新1 我已经在一个单一的方法中重现了这个问题:看起来caching必须并行写入caching驱逐不能触发(在并发垃圾收集模式下)。 如果有兴趣的话,我会把testing代码上传到公开的回购站。 我肯定正在进入CLR / GC / MemoryCache池的深层,我想我忘了我的floaties … 更新2 我在CodePlex上发布了testing代码来重现这个问题。 此外,可能有趣的是,原始生产代码作为工作者angular色在Azure中运行。 有趣的是,更改angular色的app.config中的GC并发设置没有任何作用。 可能Azure重写GC设置很像ASP.NET? 此外,在WPF和控制台应用程序下运行testing代码将产生稍微不同的驱逐结果。
如果我有一个方法中的代码块(使用.NET 4和任务并行库): var task = new Task(() => DoSomethingLongRunning()); task.Start(); 方法返回,这个任务是否会超出范围,被垃圾收集,还是会运行完成? 我还没有注意到GCing的任何问题,但是要确保我不会为GC的竞争状态而设置自己。
我正在使用调用rm(list=ls())来定期清理R中的内存。 之后我需要调用垃圾回收器gc()吗? 这两个函数有什么区别? gc()对某些variables调用rm()吗?
我们在过去的8个月里一直在使用Xamarin iOS,并开发了一个具有许多屏幕,function,嵌套控件的非平凡的企业应用程序。 我们已经做了我们自己的MVVM拱门,跨平台BLL&DAL“推荐”。 我们在Android之间共享代码,甚至在我们的networking产品上使用BLL / DAL。 除了现在在项目的发布阶段,我们发现在Xamarin基于iOS的应用程序中无处不在的内存泄漏。 我们已经遵循了所有的“准则”来解决这个问题,但现实情况是,C#GC和Obj-C ARC似乎是不兼容的垃圾收集机制,它们以目前的方式互相叠加在单点触摸平台上。 我们发现的现实是,对于任何非平凡的应用程序,本机对象和被pipe理对象之间的硬周期将会发生,并且频繁出现。 例如,在使用lambdaexpression式或手势识别器的任何地方发生这种情况都非常容易。 加上MVVM的复杂性,这几乎是一个保证。 错过其中的一种情况,整个对象的graphics将永远不会被收集。 这些图表会引诱其他物体并像癌症一样长大,最终导致iOS的迅速和无情的消灭。 Xamarin的回答是对这个问题毫无兴趣的推迟,以及“开发者应该避免这些情况”的不切实际的期望。 仔细考虑这一点,可以看出这是垃圾收集在Xamarin中基本上被破坏了 。 现在我认识到,在传统的c#.NET意义上,你并不真正在Xamarin iOS中获得“垃圾收集”。 你需要雇用“垃圾维护”模式,实际上是让GC移动并完成工作,即使这样,它也永远不会是完美的 – 不确定性。 我的公司投入了大量资金,试图阻止我们的应用程序崩溃和/或内存不足。 我们基本上必须明确地recursion处理每一个该死的东西,并在应用程序中实施垃圾维护模式,只是为了停止崩溃,并有一个可行的产品,我们可以出售。 我们的客户是支持和宽容的,但我们知道这不能永远持续下去。 我们希望Xamarin有一个专门的团队在这个问题上工作,并一劳永逸。 不幸的是,看起来不像。 问题是,我们的经验是用Xamarin编写的非平凡企业级应用程序的例外规则吗? UPDATE 请参阅DisposeEx方法和解决scheme的答案。
我刚刚读过这个: http://www.artima.com/lejava/articles/azul_pauseless_gc.html 虽然我有编译器的一些经验,但我没有做任何有关垃圾收集的事情。 对我来说是一个很大的黑盒子。 我一直在努力去理解这篇文章提到的问题。 我理解这个问题(执行大多数垃圾收集器时有一个暂停),我明白他们声称他们的实现没有这个问题。 但是我不明白为什么这个问题首先出现(这个问题似乎被认为是在原文中被理解了),结果我不明白他们的解决scheme为什么会起作用。 有人可以向我解释: 为什么垃圾收集者有一般的停顿 为什么Azul的gc没有这个问题? 我倾向于在graphics解释的时候更好地理解这种事情 – 可能使用代码编辑器完成的小内存模式就足够了。 谢谢!
我希望有一些长期运行的服务器应用程序定期输出Java中的一般GC性能数字,例如Runtime.freeMemory()等效的GC等等。类似于完成的循环次数,平均时间等。 我们有系统运行在客户机器上,怀疑configuration不当的内存池导致GC频率和长度过大 – 我觉得定期报告基本的GC活动是很好的。 有没有任何平台独立的方式来做到这一点? 编辑:我特别想输出这个数据到系统日志(控制台),而运行; 这不是我想要连接到JVM的东西,就像JConsole或JVisualVM一样。 编辑2:MX bean看起来像我想要的 – 有没有人有一个工作代码的例子,获得其中之一?
有没有什么办法来控制何时执行垃圾收集? 我想让它在某些时候执行垃圾收集,以确保我的网站的顺利运行
我们正在创build多个子类加载器,将多个子应用程序加载到Java应用程序“容器”中,进行热部署的原型devise。 当一个特定类加载器的类path发生了变化(例如,jar被添加,删除,更新)时,旧的类加载器被抛弃(未引用),并为jar的新类path创build一个新的类加载器。 更新类path后,触发热部署,我们采取了堆转储。 堆转储(使用内存分析器)表明旧的类加载器没有被垃圾回收。 父类加载器中的某些类正在caching旧的类加载器。 下面的东西被调用来清除这些caching: java.lang.ResourceBundle.clearCache(classLoader); org.apache.commons.logging.LogFactory.release(classLoader); java.beans.Introspector.flushCaches(); 即使在清除了上述caching之后,旧的加载器仍然没有被垃圾收集。 其余的类加载器引用如下: 由类加载器加载的类 java.lang.Package由类加载器本身创build java.lang.ProtectionDomain由类加载器本身创build 以上所有都是类加载器中的循环引用,它应该触发一个垃圾回收。 我不知道为什么不是。 有人知道为什么旧的类加载器仍然不被垃圾收集,即使是循环引用?