我知道在PHP中,你不必释放内存。 垃圾回收器到达了吗?
我来自C ++背景,我已经使用C#大约一年。 像许多其他人一样,为了确定性的资源pipe理为什么没有内置于语言中,我却不知所措。 而不是确定性的析构函数,我们有处理模式。 人们开始怀疑是否通过他们的代码传播一次性使用癌症是值得的。 在我的C ++偏见的大脑中,似乎使用引用计数智能指针与确定性析构函数是从垃圾回收器,要求您实现IDisposable和调用处置来清理您的非内存资源的重大一步。 诚然,我不是很聪明…所以我纯粹是从一个渴望更好地理解为什么事情是这样的欲望这个问。 如果C#被修改,那么: 对象是引用计数。 当对象的引用计数变为零时,将在对象上确定性地调用资源清理方法,然后将该对象标记为垃圾回收。 垃圾收集发生在未来的某个非确定性时间,回收内存。 在这种情况下,您不必实现IDisposable或记得调用Dispose。 如果要释放非内存资源,只需实施资源清理function即可。 为什么这是一个坏主意? 这会打败垃圾收集器的目的吗? 实施这样的事情是否可行? 编辑:从目前为止,这是一个糟糕的主意,因为 无需参考计数,GC更快 在对象图中处理周期的问题 我认为第一是有效的,但是第二很容易处理使用弱引用。 那么速度优化大于你的缺点: 不能及时释放非内存资源 可能会很快释放一个非内存资源 如果你的资源清理机制是确定性的,并且内置在语言中,你可以消除这些可能性。
我是ORMLite的主要作者,它在类上使用Java注释来构build数据库模式。 对于我们的包来说,一个很大的启动性能问题就是Android 1.6下的注释方法的调用。 我看到相同的行为通过3.0。 我们看到,以下简单的注释代码非常令人难以置信 ,是一个真正的性能问题。 在快速的Android设备上,1000次调用注释方法几乎需要一秒钟的时间。 在我的Macbook Pro上运行相同的代码可以在同一时间做28百万(sic)的电话。 我们有一个注释,其中有25个方法,我们想要做超过50秒。 有谁知道这是为什么发生,如果有任何工作? ORMLite在caching这些信息方面可以做些什么,但是有什么我们可以在Android下“修复”注释? 谢谢。 public void testAndroidAnnotations() throws Exception { Field field = Foo.class.getDeclaredField("field"); MyAnnotation myAnnotation = field.getAnnotation(MyAnnotation.class); long before = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) myAnnotation.foo(); Log.i("test", "in " + (System.currentTimeMillis() – before) + "ms"); } @Target(FIELD) @Retention(RUNTIME) private static […]
任何人都可以指出我如何实施垃圾收集的好来源? 我正在做一个类似lisp的解释性语言。 它目前使用引用计数,但当然不能释放循环依赖对象。 我一直在阅读标记和扫描,三色标记,移动和非移动,渐进和停止的世界,但是…我不知道什么是最好的方式来保持整齐的物体分成几组,尽可能减less对象内存开销,或者如何增量执行。 我已经阅读了一些引用计数的语言使用循环参考检测,我可以使用。 我知道我可以像Boehm一样免费使用collections家,但我想学习如何自己做。 我将不胜感激任何在线教材,或者帮助那些没有像我这样的主题经验的人。
我正在寻找一个工具或脚本,将从我的Web应用程序的控制台日志,parsing出垃圾收集信息,并以有意义的方式显示它。 我正在使用以下标志在Sun Java 1.4.2 JVM上启动: -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails 日志输出如下所示: 54.736: [Full GC 54.737: [Tenured: 172798K->18092K(174784K), 2.3792658 secs] 257598K->18092K(259584K), [Perm : 20476K->20476K(20480K)], 2.4715398 secs] 如果我有一个可以直观地显示垃圾收集趋势的工具,那么从这些types的日志条目中就可以理解成几百种。
如何获得一个对象的引用计数 是否有可能确定一个JavaScript对象有多个引用 ? 或者,如果除了我正在访问的引用之外还有引用? 甚至只是为了得到引用计数本身? 我可以从javascript本身find这些信息,还是需要跟踪我自己的引用计数器。 显然,对于我的代码访问对象,必须至less有一个引用。 但是我想知道的是,如果有任何其他的引用,或者我的代码是唯一被访问的地方。 我希望能够删除对象,如果没有别的引用它。 如果你知道答案,就没有必要读这个问题的其余部分。 下面只是一个例子,使事情更清楚。 用例 在我的应用程序中,我有一个名为contacts的Repository对象实例,其中包含所有我的联系人数组。 还有多个Collection对象实例,如friends集合和coworkers集合。 每个集合包含一个数组,其中包含来自contacts Repository一组不同的项目。 示例代码 为了使这个概念更具体,请考虑下面的代码。 Repository对象的每个实例都包含特定types的所有项目的列表。 您可能有一个联系人存储库和一个单独的事件存储库。 为了简单起见,您可以获取,添加和删除项目,并通过构造函数添加许多项目。 var Repository = function(items) { this.items = items || []; } Repository.prototype.get = function(id) { for (var i=0,len=this.items.length; i<len; i++) { if (items[i].id === id) { return this.items[i]; } } } Repository.prototype.add = function(item) […]
我很好奇python中__del__的细节,什么时候以及为什么它应该被使用,什么不应该被使用。 我已经学会了这样一个艰难的方式,它不是真正的天真地期望从析构函数中得到什么,因为它不是__new__ / __init__的对立面。 class Foo(object): def __init__(self): self.bar = None def open(self): if self.bar != 'open': print 'opening the bar' self.bar = 'open' def close(self): if self.bar != 'closed': print 'closing the bar' self.bar = 'close' def __del__(self): self.close() if __name__ == '__main__': foo = Foo() foo.open() del foo import gc gc.collect() 我在文档中看到, 不保证__del__()方法在解释器退出时仍然存在的对象被调用。 […]
我试图找出多less内存我的对象需要看看有多less人在大对象堆(这是任何超过85,000字节)结束。 是简单的为int添加4,长为8,为每个对象的任何引用types等4,或者如果你是在64位8,或者有方法,属性等开销
我以为如果你的程序没有,那么GC会调用Dispose,但是你应该在你的程序中调用Dispose()来使清理变得确定。 但是,从我的小testing程序,我没有看到Dispose被调用…. public class Test : IDisposable { static void Main(string[] args) { Test s = new Test(); s = null; GC.Collect(); Console.ReadLine(); } public Test() { Console.WriteLine("Constructor"); } public void Dispose() { Console.WriteLine("Dispose"); } } //输出只是“构造函数”,我不会像我所期望的那样得到“Dispose”。 这是怎么回事? 编辑:是的,我知道我应该调用Dispose() – 我使用一次性对象时遵循标准模式。 我的问题出现了,因为我试图追踪一些代码中的泄漏,这是一个被pipe理的C ++(另一个复杂的层次,可能是另一个线程的主题)。
假设我用这个方法在Java中创build一个临时文件 File tmp = File.createTempFile(prefix, suffix); 如果我不明确地调用delete()方法,文件何时被删除? 直观地说,可能是JVM终止,或者更早 (垃圾收集器),或者更晚 (通过一些操作系统清除过程)。