我正在使用R中的一些建模算法,其中一种是在Java(bartMachine)中运行的。我发现随着数据的大小,我需要在运行建模算法之前增加java的最大堆空间。
我这样做是这样的:
options(java.parameters = "-Xmx16g")
我的问题是,如果没有其他算法将使用Java(或至少有那么多的堆空间),我是否需要在之后重新设置堆空间?还是会根据需要回收分配给Java的内存而不会造成性能损失?
我已经搜索了有关该主题的一些内容,并且了解了如何更改/降低堆空间。我也知道R / Java会进行垃圾回收以从内存中删除旧对象以释放更多空间。
我不了解的是更改堆空间如何影响其他程序可用的内存,以及在这种情况下更改使用后的堆大小是否必要甚至是个好主意。
我已经看过的一些答案/资源:
http://www.bramschoenmakers.nl/zh-CN/node/726
https://cran.r-project.org/web/packages/bartMachine/bartMachine.pdf
它是实现的定义,并取决于受许多参数影响的实现。垃圾收集器会影响它。在使用Oracles JVM 1.7的Mac上,它默认为并行收集器,-XX:+UseParallelGC
并且该收集器不会将内存释放回操作系统。我在Mac上尝试了一下,但没有释放任何东西,但使用-XX:+UseG1GC
了。您可以使用以下命令查看默认版本:
java -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -version
如果您使用支持内存的JVM和正确的垃圾收集器,则可以使用一些参数来调整内存的释放方式,即
-XX:MinHeapFreeRatio (default is 40)
-XX:MaxHeapFreeRatio (default is 70)
但是它们会碰到很多东西(JVM决定何时释放内存,只是释放大量对象可能不会触发它)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句