我正在使用R中的一些建模算法,其中一个在
Java(
bartMachine)中运行.我发现在运行建模算法之前,我需要根据数据的大小增加java的最大堆空间.
我这样做是这样的:
options(java.parameters =“ – Xmx16g”)
我的问题是,如果没有其他算法将使用java(或至少那么多堆空间),我是否需要重置堆空间?或者根据需要回收分配给java的内存而不会丢失性能?
我已经搜索了一些关于这个主题的内容,我了解如何更改/降低堆空间.我也明白R / Java会做垃圾收集来从内存中删除旧对象以释放更多空间.
我不明白的是,更改堆空间会如何影响其他程序可用的内存,以及在这种情况下是否有必要甚至是一个好主意来改变使用后的堆大小.
我已经看过的一些答案/资源:
Is there a way to lower Java heap when not in use?
Java garbage collector – When does it collect?
http://www.bramschoenmakers.nl/en/node/726
https://cran.r-project.org/web/packages/bartMachine/bartMachine.pdf
解决方法
它的实现是定义的,取决于由很多参数影响的实现.
The garbage collector can affect it.在使用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决定何时释放内存,只释放大量对象可能不会触发它).