我有一个关于灌木垃圾收集的问题。 OutOfMemoryError引导我进入以下最小示例。我用JAVA_MEM=-Xmx500m ruby -w -J-verbose:gc
运行它来将内存限制为500 MB并显示gc输出。
(1..5_000_000).to_a
(1..5_000_000).to_a
这很好用。但是,运行这个:
(1..5_000_000).to_a
(1..5_000_000).to_a
(1..5_000_000).to_a
我得到一个OutOfMemoryError(请参阅下面的完整OutOfMemoryError堆栈跟踪)。这让我很困惑,因为垃圾收集器应该能够释放第一个对象使用的内存。
堆栈跟踪输出:
java.lang.OutOfMemoryError: Java heap space
at org.jruby.RubyFixnum.newFixnum(RubyFixnum.java:211)
at org.jruby.RubyRange.to_a(RubyRange.java:406)
at org.jruby.RubyRange$INVOKER$i$0$0$to_a.call(RubyRange$INVOKER$i$0$0$to_a.gen)
at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrNBlock.call(JavaMethod.java:306)
at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:293)
at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:131)
at app.performance.invokeOther4:to_a(app/performance.rb)
at app.performance.RUBY$script(app/performance.rb:3)
at java.lang.invoke.LambdaForm$DMH/1172823033.invokeStatic_LLLLLLL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$DMH/1009311031.invokeSpecial_LLLLLLLL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$NFI/1072591159.invoke_LLLLLLLL_L(LambdaForm$NFI)
at java.lang.invoke.LambdaForm$DMH/871997608.invokeStatic_LL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1136)
at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
at java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
at java.lang.invoke.LambdaForm$LFI/515921628.interpret_L(LambdaForm$LFI)
at java.lang.invoke.LambdaForm$NFI/1072591159.invoke_LLLLLLLL_L(LambdaForm$NFI)
at java.lang.invoke.LambdaForm$DMH/871997608.invokeStatic_LL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1136)
at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
at java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
at java.lang.invoke.LambdaForm$LFI/1903586078.interpret_L(LambdaForm$LFI)
at java.lang.invoke.LambdaForm$NFI/939187759.invoke_LLLLLLLLL_L(LambdaForm$NFI)
at java.lang.invoke.LambdaForm$DMH/871997608.invokeStatic_LL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1136)
at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
at java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
at java.lang.invoke.LambdaForm$LFI/1903586078.interpret_L(LambdaForm$LFI)
at java.lang.invoke.LambdaForm$NFI/939187759.invoke_LLLLLLLLL_L(LambdaForm$NFI)
at java.lang.invoke.LambdaForm$DMH/871997608.invokeStatic_LL_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1136)
at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
jruby版本:
jruby 9.0.1.0 (2.2.2) 2015-09-02 583f336 OpenJDK 64-Bit Server VM 24.79-b02 on 1.7.0_79-b14 +jit [linux-amd64]