Tag: 垃圾收集

GHC垃圾收集的RTS选项

我有一个Haskell程序处理一个文本文件,并build立一个Map (数百万元)。 整个事情可以运行2-3分钟。 我发现调整-H和-A选项对运行时间有很大的影响。 有关于RTS的这个function的文档 ,但是对于我来说这是一个很难读懂的东西,因为我不知道GC理论中的algorithm和术语。 我正在寻找一个较less的技术解释,最好是特定于Haskell / GHC。 有没有关于select这些选项的明智价值的参考? 编辑:这是代码,它build立一个给定的单词列表trie。 buildTrie :: [B.ByteString] -> MyDFA buildTrie l = fst3 $ foldl' step (emptyDFA, B.empty, 1) $ sort $ map B.reverse l where step :: (MyDFA , B.ByteString, Int) -> B.ByteString -> (MyDFA , B.ByteString, Int) step (dfa, lastWord, newIndex) newWord = (insertNewStates, newWord, newIndex […]

locking语句与Monitor.Enter方法

我想这是一个有趣的代码示例。 我们有一个类 – 我们称之为testing – 用Finalize方法。 在Main方法中有两个代码块,我正在使用一个locking语句和一个Monitor.Enter()调用。 另外,我在这里有两个Test类的实例。 实验非常简单:在locking块中将Testvariables置零,然后尝试使用GC.Collect方法调用手动收集它。 所以,要看到Finalize调用,我打电话给GC.WaitForPendingFinalizers方法。 如你所见,一切都很简单。 通过locking语句的定义,编译器将其打开到try {…} finally {..}块,并在try块和Monitor中调用Monitor.Enter 。 然后它在finally块中退出。 我试图手动实现try-finally块。 我期望在这两种情况下都有相同的行为 – 使用locking和使用Monitor.Enter 。 但是,令人惊讶的是,它是不同的,如下所示: public class Test { private string name; public Test(string name) { this.name = name; } ~Test() { Console.WriteLine(string.Format("Finalizing class name {0}.", name)); } } class Program { static void Main(string[] args) { […]

JavaFX 8隐藏阶段时发生内存泄漏

我有一个JavaFX应用程序,当按下Xbutton时最小化托盘。 我一直在通过VisualVM监视应用程序的内存趋势。 怪异的部分是,当应用程序打开或最小化到任务栏时,内存总是回到使用的初始内存。 但是,当它最小化到托盘( stage.hide() , stage.hide() )时,内存得到GCed,但处于上升趋势(泄漏)。 在VisualVM中,旧版空间不断增加,一旦达到最大值,应用程序将无响应,CPU高达80%。 我注意到, 如果我通过双击托盘图标等stage.show()应用程序,GC将清除一切恢复正常 。 但是,如果长时间离开,那么根本就不会GC老一辈。 堆转储显示javafx.scene.Scene#7和javafx.scene.Node[]#2具有最多的保留空间。 如果舞台没有隐藏,两者都不会出现。 在引用下,它显示了this[] -> dirtyNodes() 。 this – value: javafx.scene.Node[] #2 <- dirtyNodes – class: javafx.scene.Scene, value: javafx.scene.Node[] #2 <- value – class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value: javafx.scene.Scene #7 是什么原因造成的,我该如何解决?

为什么gc()没有释放内存?

我使用64 GB RAM在Windows 64位计算机上运行模拟。 内存使用达到55% ,在完成模拟运行后,我通过rm(list=ls())删除工作空间中的所有对象,然后是double gc() 。 我认为这会为下一次模拟运行释放足够的内存,但是实际上内存使用量仅下降1% 。 咨询了很多不同的论坛,我找不到一个令人满意的解释,只有模糊的评论,如: “根据您的操作系统,释放的内存可能不会返回到操作系统,而是保留在进程空间中。” 我想查找以下信息: 1)哪个操作系统和在哪个条件下释放内存不会被返回到操作系统,以及 2)如果除了closuresR还有其他补救措施,并且在下次模拟运行时再次启动?

D编程没有垃圾收集器

我今天一直在看D,表面上看起来相当惊人。 我喜欢它如何在语言中直接包含许多更高层次的构造,所以不必使用愚蠢的黑客或简洁的方法。 有一件事真的让我担心,如果GC。 我知道这是一个很大的问题,并且已经阅读了很多关于它的讨论。 我自己从这个问题萌生的简单testing表明GC非常慢。 比直接C ++做同样的事情要慢10倍以上。 (显然,testing并不直接转化为现实世界,但是性能打击是极端的,会减缓真实世界发生的类似行为(快速分配许多小对象) 我正在研究编写一个实时低延迟audio应用程序,GC可能会破坏应用程序的性能,使其几乎无用。 从某种意义上讲,如果它有任何问题,将会毁掉实时audio方面,因为与graphics不同,audio以更高的帧速率(44000+ vs 30-60)运行。 (由于它的低延迟比标准的可以caching大量数据的audio播放器更重要) 禁用GC可将结果提高到C ++代码的20%左右。 这很重要。 我会在最后给出代码进行分析。 我的问题是: 用一个标准的智能指针实现代替D的GC是多困难的,这样依赖于GC的库仍然可以被使用。 如果我彻底删除GC,那么我将失去很多烦琐的工作,因为与C ++相比,D已经有了限制库。 GC.Disable只暂时停止垃圾回收(阻止GC线程运行),并且GC.Enable会在停止的地方回收。 所以我可能会禁用GC在高cpu使用时间运行,以防止延迟问题。 有什么办法强制一个模式,不要一直使用GC。 (这是因为我没有在D编程,当我开始写我的眼镜不使用GC我想确保我不会忘记执行自己的清理。 是否可以轻松更换D中的GC? (不是我想要的,但有一天玩不同的GC方法可能很有趣…这与我想的类似) 我想要做的是交易记忆的速度。 我不需要GC每隔几秒就运行一次。 事实上,如果我可以正确地实现自己的数据结构的内存pipe理,那么根本就不需要经常运行。 只有当内存稀less时,我才需要运行它。 从我读过的东西看,尽pipe如此,你等待的时间越长,它就越慢。 由于在我的应用程序中通常会有一些时间,我可以不经问题就调用它,这将有助于缓解一些压力(但是再次,可能会有几个小时我将无法调用它)。 我并不担心内存限制。 我宁愿在速度上“浪费”内存(当然,最多也是一个点)。 首要的是延迟问题。 从我读过的内容来看,只要我不使用任何依赖GC的库或语言结构,我至less可以走C / C ++的路线。 问题是,我不知道那些做的。 我已经看到string,新的等提到,但这是否意味着我不能使用string的构build,如果我不启用GC? 我读过一些错误报告,说GC可能是错误的,这可以解释它的性能问题? 此外,D使用了更多的内存,事实上,D在C ++程序之前耗尽内存。 在这种情况下,我想这大概是15%左右。 我想这是给GC的。 我意识到下面的代码并不代表你的平均程序,但是它说的是,当程序实例化很多对象时(比如在启动时),它们会慢得多(10倍是一个很大的因素)。 GC可以在启动时“暂停”,那么它不一定是个问题。 真正好的是,如果我能以某种方式让编译器自动GC一个本地对象,如果我没有具体释放它。 这几乎是两全其美。 例如, { Foo f […]

如何在C ++中实现垃圾收集

我看到一些关于在C中实现GC的post,有人说这是不可能的,因为C是弱types的。 我想知道如何在C ++中实现GC。 我想知道如何做到这一点。 非常感谢你! 这是我朋友告诉我的彭博采访问题。 那个时候他做得很糟糕。 我们想知道你的想法。

内存分配/释放瓶颈?

在典型的真实世界的程序中,内存分配/释放有多less瓶颈? 来自任何types的性能通常很重要的程序的答案是受欢迎的。 malloc / free / garbage collection的体面实现是否足够快,以至于它只是在几个极端情况下的一个瓶颈,或者大多数性能关键型软件会从试图保持内存分配量下降或拥有更快的malloc / free /垃圾回收的实现? 注意:我不是在这里谈论实时的东西。 对性能至关重要,我的意思是吞吐量很重要,但延迟并不一定。 编辑:虽然我提到malloc,这个问题并不打算是特定于C / C ++。

优化Haskell GC的使用

我正在运行一个长期存在的Haskell程序。 运行+RTS -N5 -s -A25M (我的L3caching的大小)我看到: 715,584,711,208 bytes allocated in the heap 390,936,909,408 bytes copied during GC 4,731,021,848 bytes maximum residency (745 sample(s)) 76,081,048 bytes maximum slop 7146 MB total memory in use (0 MB lost due to fragmentation) Tot time (elapsed) Avg pause Max pause Gen 0 24103 colls, 24103 par 240.99s 104.44s 0.0043s […]

为什么纯粹的函数式语言不使用引用计数?

在纯function语言中,数据是不可变的。 通过引用计数,创build参考周期需要更改已经创build的数据。 似乎纯粹的function语言可以使用引用计数,而不用担心循环的可能性。 我是对的? 如果是这样,他们为什么不呢? 我知道引用计数在许多情况下比GC慢,但至less减less了停顿时间。 在暂停时间不好的情况下,可以select使用参考计数。

即使session.gc_probability设置为0,Symfony也会在Ubuntu 14.04上调用PHP垃圾收集器

由于某些原因,我的Symfony 2.5应用程序的标题状态调用了PHP垃圾回收器,即使当我所有的php.ini文件都有: session.gc_probability = 0 有谁知道如何防止这种情况发生? 错误消息即时通讯: Notice: SessionHandler::gc(): ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) in /<path-to-my-site>/var/cache/dev/classes.php line 432 FROM PHPINFO(): Directive Local Value Master Value session.gc_divisor 1000 1000 session.gc_maxlifetime 86400 86400 session.gc_probability 0 0 我知道我可以给www / data用户权限/var/lib/php5文件夹或将session.save_path更改为www-data用户已经访问的地方,但是我想知道为什么这个过程是平坦的当它被禁用时被调用。