我应该在使用后重置 Java 堆 space 最大值吗?
Should I reset Java heap space maximum after use?
我正在使用 R 中的一些建模算法,其中之一在 Java (bartMachine) 中运行。我发现根据我的数据大小,我需要在 运行 建模算法之前为 java 增加最大堆 space。
我是这样做的:
options(java.parameters = "-Xmx16g")
我的问题是,如果没有其他算法将使用 java(或至少那么多堆 space,我之后是否需要重置堆 space =52=])?还是会根据需要回收分配给 java 的内存而不损失性能?
我已经围绕这个主题进行了一些搜索,并且我了解如何 change/lower 堆space。我也明白 R/Java 将进行垃圾收集以从内存中删除旧对象以释放更多 space.
我不明白的是更改堆 space 如何影响其他程序可用的内存,以及在这种情况下是否有必要甚至是一个好主意来更改堆大小 post-使用。
我已经看过的一些answers/resources:
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
,并且此收集器不会将内存释放回 OS。我在 mac 上试过它并没有释放任何东西,但使用 -XX:+UseG1GC
却释放了任何东西。您可以使用以下命令查看您的默认版本:
java -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -version
如果您使用支持它的 JVM 和正确的垃圾收集器,您可以使用一些参数来调整内存的释放方式,即
-XX:MinHeapFreeRatio (default is 40)
-XX:MaxHeapFreeRatio (default is 70)
但它们时好时坏(JVM 决定何时释放内存,只是释放大量对象可能不会触发它)。
最近使用了一个 Java-繁重的非 ML 程序,我感受到了你的痛苦。
基于一个不可否认的技术事实,我无法告诉你是否重置动态分配的内存,但我的个人经验告诉我,如果你打算在 [=48] 之后继续在本机 R 环境中处理=] 工作,你可能应该。能控制的最好控制。
原因如下:
我唯一一次 运行 内存不足(即使是处理 MASSIVE 平面文件)是在我以某种方式使用 JVM 时。这不是一次性的事情,它经常发生。
它甚至发生在通过 Java 驱动的 XLConnect 读取和写入大型 excel 文件时;内存很快就被卡住了。看来R和Java的玩法很失败
而且,r 不会像您希望的那样自动进行垃圾收集。它在 OS 请求更多内存时收集,但在此之前事情会变得很慢。
此外,R 只能看到它创建的内存中的对象,而不是它解释的对象,因此你的 Java kulch 将在 R 不知情的情况下徘徊。因此,如果 JVM 创建了它,R 将不会清理它,如果Java 在休眠之前不会这样做。如果有选择地回收内存,您可能会出现零散的内存间隙,这会对性能产生很大影响。
我个人的方法是创建集、变量、框架...仅根据我的需要创建子集,然后 rm()
和 gc()
...删除并强制进行垃圾回收。
继续下一步,做繁重的工作。如果我 运行 基于 Java 的软件包,我会更频繁地执行此清除以保持内存清洁。
Java 过程完成后,我使用 detach(yourlibraryname)
和 gc()
清除所有内容。
如果你调整了'heaps',我会在这里写下重新调整,降低你给Javas动态内存的分配,因为如果Java 虚拟机仍在使用中,但据我所知没有运行。所以你应该重置它并把 R 的用途还给 R。我认为从长远来看 运行 它将使您受益于更快的处理速度和更少的锁定。
在您使用它时了解它如何影响您的系统的最佳方法是使用 sys.time
或 proc.time
函数来查看您的脚本在使用和不使用强制垃圾收集时需要多长时间、删除、分离和堆重新分配。
您可以在此处深入了解如何执行此操作:
IDRE -UCLE proc.time functions
希望这对一些人有所帮助!
我正在使用 R 中的一些建模算法,其中之一在 Java (bartMachine) 中运行。我发现根据我的数据大小,我需要在 运行 建模算法之前为 java 增加最大堆 space。
我是这样做的:
options(java.parameters = "-Xmx16g")
我的问题是,如果没有其他算法将使用 java(或至少那么多堆 space,我之后是否需要重置堆 space =52=])?还是会根据需要回收分配给 java 的内存而不损失性能?
我已经围绕这个主题进行了一些搜索,并且我了解如何 change/lower 堆space。我也明白 R/Java 将进行垃圾收集以从内存中删除旧对象以释放更多 space.
我不明白的是更改堆 space 如何影响其他程序可用的内存,以及在这种情况下是否有必要甚至是一个好主意来更改堆大小 post-使用。
我已经看过的一些answers/resources:
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
,并且此收集器不会将内存释放回 OS。我在 mac 上试过它并没有释放任何东西,但使用 -XX:+UseG1GC
却释放了任何东西。您可以使用以下命令查看您的默认版本:
java -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -version
如果您使用支持它的 JVM 和正确的垃圾收集器,您可以使用一些参数来调整内存的释放方式,即
-XX:MinHeapFreeRatio (default is 40)
-XX:MaxHeapFreeRatio (default is 70)
但它们时好时坏(JVM 决定何时释放内存,只是释放大量对象可能不会触发它)。
最近使用了一个 Java-繁重的非 ML 程序,我感受到了你的痛苦。
基于一个不可否认的技术事实,我无法告诉你是否重置动态分配的内存,但我的个人经验告诉我,如果你打算在 [=48] 之后继续在本机 R 环境中处理=] 工作,你可能应该。能控制的最好控制。
原因如下:
我唯一一次 运行 内存不足(即使是处理 MASSIVE 平面文件)是在我以某种方式使用 JVM 时。这不是一次性的事情,它经常发生。
它甚至发生在通过 Java 驱动的 XLConnect 读取和写入大型 excel 文件时;内存很快就被卡住了。看来R和Java的玩法很失败
而且,r 不会像您希望的那样自动进行垃圾收集。它在 OS 请求更多内存时收集,但在此之前事情会变得很慢。
此外,R 只能看到它创建的内存中的对象,而不是它解释的对象,因此你的 Java kulch 将在 R 不知情的情况下徘徊。因此,如果 JVM 创建了它,R 将不会清理它,如果Java 在休眠之前不会这样做。如果有选择地回收内存,您可能会出现零散的内存间隙,这会对性能产生很大影响。
我个人的方法是创建集、变量、框架...仅根据我的需要创建子集,然后 rm()
和 gc()
...删除并强制进行垃圾回收。
继续下一步,做繁重的工作。如果我 运行 基于 Java 的软件包,我会更频繁地执行此清除以保持内存清洁。
Java 过程完成后,我使用 detach(yourlibraryname)
和 gc()
清除所有内容。
如果你调整了'heaps',我会在这里写下重新调整,降低你给Javas动态内存的分配,因为如果Java 虚拟机仍在使用中,但据我所知没有运行。所以你应该重置它并把 R 的用途还给 R。我认为从长远来看 运行 它将使您受益于更快的处理速度和更少的锁定。
在您使用它时了解它如何影响您的系统的最佳方法是使用 sys.time
或 proc.time
函数来查看您的脚本在使用和不使用强制垃圾收集时需要多长时间、删除、分离和堆重新分配。
您可以在此处深入了解如何执行此操作:
IDRE -UCLE proc.time functions
希望这对一些人有所帮助!