gpt4 book ai didi

garbage-collection - JRuby-如何启动垃圾收集器?

转载 作者:行者123 更新时间:2023-12-04 14:03:58 24 4
gpt4 key购买 nike

我启动了我的JRuby irb控制台并输入:

irb(main):037:0* GC.enable
(irb):37 warning: GC.enable does nothing on JRuby
=> true
irb(main):038:0> GC.start
=> nil
irb(main):039:0>

如何在程序执行期间手动启用或启动JVM垃圾?

我问是因为我有一个程序,该程序需要生成约500 MB的测试数据并将其保存在MySQL中。该程序使用大约5个级别的嵌套循环,并且在生成大约100 MB的测试数据后,由于没有更多的堆内存,它会因JVM内存堆异常而崩溃。我想让垃圾收集器在每次外部循环运行之后运行,以便可以清理在内部循环中创建的所有孤立对象。

最佳答案

您的问题的确切答案是:

require 'java'

java_import 'java.lang.System'

# ...

System.gc()

但是,请记住,即使JVM通常确实运行GC,也可能会或可能不会运行GC –非常取决于JVM的实现。这也可能对性能造成很大的影响。

显然,更好的答案是确保在嵌套循环的末尾,对正在生成的测试数据不保留任何引用,以便稍后确实可以将其回收。例子:
class Foo; end

sleep(5)

ary = []
100_000.times { 100_000.times{ ary << Foo.new }; puts 'Done'; ary = [] }

如果使用 jruby -J-verbose:gc foo.rb运行它,则应该看到GC定期声明对象;使用JVisualVM也很清楚(示例中的 sleep是给一些时间来连接到JVisualVM中的Jruby进程)。

最后,您可以通过添加以下标志来增加堆内存: -J-Xmx256m;有关更多详细信息,请参见 the JRuby wiki

巧合的是,这是马里奥·卡莫(Mario Camou)最近在尼克·西格(Nick Sieger)重新张贴的马德里DevOps上发表的 a mindmap on GC tuning

关于garbage-collection - JRuby-如何启动垃圾收集器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com