当我按下Eclipse中的"运行垃圾收集器"按钮时会发生什么?它只是调用System.gc()吗?
据说我们不能garbage collection在java中强制进程.
毕竟,它是一个守护程序线程.
但有时候,为什么我们System.gc( );明确地调用函数?
值得一试吗?任何Pro和Con的?
如果在许多情况下没用,为什么不从Java中弃用此方法?
PS:用例子说明会很有用
我在本地模式下使用pyspark 1.5在我的4核16GB机器上运行了大约3百万条记录x 15列所有字符串的工作流程.我注意到如果我在没有首先重启spark的情况下再次运行相同的工作流程,则内存耗尽并且我会出现Out of Memory Exceptions.
由于我的所有缓存总计大约1 GB,我认为问题在于垃圾收集.我能够通过调用以下方式手动运行python垃圾收集器:
import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected
Run Code Online (Sandbox Code Playgroud)
这有点帮助.
我根据这篇文章使用了spark的GC设置,并尝试压缩RDD并将序列化器更改为Kyro.这减慢了处理速度,对内存没有多大帮助.
因为我确切知道何时有空闲的cpu周期来调用GC,所以它可以帮助我了解如何在JVM中手动调用它.
出于内存优化的原因,我在分析期间启动自己的垃圾收集器,以检查在处理它们之后是否正确清理了对象.
但是,对垃圾收集器的调用是不够的,似乎无法保证清理它的内容.
有没有办法调用它,以确保它能够在分析条件下尽可能多地恢复(当然,这在生产中没有意义)?或者"多次调用"是"几乎可以肯定"的唯一方法?
或者我只是误解了垃圾收集器的一些事情?
我创建了一个带有一系列子项的trie树.删除单词时,我将子项设置为null,我假设删除该节点(delete是相对术语).我知道null不会删除子节点,只需将其设置为null,这在使用大量单词时会导致溢出堆.
在linux上运行top,我可以很快看到我的内存使用率飙升到1gb,但是如果我在删除后强制进行垃圾收集(Runtime.gc()),则内存使用量将达到50mb并且永远不会高于此值.据我所知,java默认情况下会在堆溢出发生之前运行垃圾收集,但是我无法看到这种情况发生.
当CPU处于5%到8%的负载时,有什么条件会阻止JVM运行FULL Garbage Collection?
我看到一个持续浅的GC循环,但无法调整JVM以运行FULL GC.
我在哪里可以找到JVM说"我忙得跑"的条件.