当前位置: 首页 > 知识库问答 >
问题:

我应该在使用后重置Java堆空间最大值吗?

闻华容
2023-03-14

我在用R做一些建模算法,其中一个是用Java运行的(bartMachine)。我发现,由于数据的大小,我需要在运行建模算法之前增加java的最大堆空间。

我是这样做的:

选项(java.parameters=“-Xmx16g”)

我的问题是,如果没有其他算法使用java(或者至少有那么多堆空间),我是否需要在以后重置堆空间?或者,分配给java的内存会根据需要回收,而不会造成性能损失?

我已经搜索了一些关于这个主题的内容,并且我了解如何更改/降低堆空间。我还了解R/Java将执行垃圾收集,从内存中删除旧对象,以释放更多空间。

我不明白的是更改堆空间如何影响其他程序的可用存储器,以及在使用后更改堆大小是否有必要,甚至是一个好主意。

我已经看过的一些答案/资源:

有没有一种方法可以在不使用时降低Java堆?

Java垃圾收集器——什么时候收集?

http://www.bramschoenmakers.nl/en/node/726

https://cran . r-project . org/web/packages/Bart machine/Bart machine . pdf

共有2个答案

锺玺
2023-03-14

最近我使用了一个非ML的Java程序,我感受到了你的痛苦。

我不能告诉你是否基于一个单一的不可否认的技术事实来重置动态分配的内存,但是我的个人经验告诉我,如果你打算在Java工作后继续在本机R环境中进行处理,你可能应该最好控制你所能控制的。

原因如下:

我唯一一次耗尽内存(即使是处理大量平面文件)是在我以某种方式使用JVM的时候。这不是一次性的事情,它经常发生。

甚至在通过Java驱动的XLConnect读取和写入大型excel文件时也会发生这种情况;记忆很快就被卡住了。这似乎是R和Java之间的一种失败。

而且,r不会像您希望的那样自动进行垃圾收集。当操作系统要求更多内存时,它会进行收集,但在这之前,事情可能会变得很慢。

此外,R只看到它创建的内存中的对象,而不看到它解释的对象,因此您的Java kulch将在R不知道的情况下徘徊。因此,如果JVM创建了它,如果Java在Hibernate之前不这样做,R将不会清理它。如果有选择地回收内存,则可能会出现碎片化的内存缺口,从而严重影响性能。

我个人的方法是创建集合,变量,框架...子集只到我需要的,然后 rm()gc()...删除并强制垃圾回收。

继续下一步并进行繁重的工作。如果我运行基于Java的包,我会更频繁地进行清除以保持内存干净。

一旦Java过程完成,我使用分离(你的图书馆名称)gc()来清除所有内容。

如果您已经调整了“heaps ”,我将在这里编写re-adjust,降低您给Java动态内存的分配,因为据我所知,如果Java虚拟机仍在使用,但没有运行,R就没有办法收回它。所以你应该重置它,把R要用的东西还给R。我认为从长远来看,它将有利于你更快的处理和更少的锁定。

了解它在使用时如何影响系统的最佳方法是使用 sys.timeproc.time 函数来查看脚本在有或没有强制垃圾回收、删除、分离和堆重新分配的情况下需要多长时间。

在这里,您可以很好地理解如何做到这一点:

IDRE-乌克尔过程时间函数

希望这对你有所帮助!

燕扬
2023-03-14

它的实现定义,并取决于由相当多的参数影响的实现。垃圾收集器可能会影响它。在使用Oracle 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决定何时释放内存,只是释放大量对象可能不会触发它)。

 类似资料:
  • 我是gRPC的新手,正在编写一个应用程序,其中8个客户端每秒向gRPC服务器发送50k个异步请求。我知道我应该为每个客户端重用该通道,但是流观察者怎么样?现在每次客户端发出请求时,我都会创建一个新的流观察者。这会是瓶颈吗?如果有任何回复,我将不胜感激!

  • 我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac

  • 问题内容: 使用CSS媒体查询,您可以用于定位设备宽度(例如iPhone或Android设备)和/或定位页面宽度的。 如果使用,则在更改桌面上浏览器窗口的大小时,CSS不会更改,因为您的桌面不会更改大小。 如果使用,则在更改桌面上浏览器窗口的大小时,可能会显示面向移动的样式,例如触摸友好的元素和菜单等。 现在已不再针对特定的浏览器(和设备?)定位,并且您应该对目标对象有所了解。那也适用于媒体查询吗

  • 我使用的是Spark独立单机,128G内存,32核。以下是我认为与我的问题相关的设置: 我有一个Spark应用程序,其中有1000个设备的循环。对于每个循环(设备),它准备特征向量,然后调用MLLib的k-Means。在循环的第25次到第30次迭代(处理第25次到第30次设备)时,它遇到了错误“Java.lang.OutOfMemoryError:Java堆空间”。 我试着从0.7到0.35进行记

  • 我在AWS EMR集群(4核m3.xlarge)上遇到这个问题,需要处理40GB的文本文件。FATAL[main]org.apache.hadoop.mapred.YarnUNICEF:运行子错误:java.lang.OutOfMemoryError:Java堆空间 它发生在映射过程中。作业开始几分钟后就会失败。emr-4.4.0、亚马逊2.7.1、Pig 0.14.0 我用不同的值尝试了这些命令

  • 问题内容: 我是nodejs和mongodb中的新手。我从nodejs应用程序中的mongodb中读取大约100000条记录时遇到问题。当我尝试获取100000条记录时,出现此错误: 严重错误:CALL_AND_RETRY_LAST分配失败-内存不足 我搜索谷歌,每个人都说配置最大旧空间大小参数,因为v8引擎大约有1,9Gb堆内存。 我的观点是,我通过eclispe运行我的应用,但我不知道如何配置