物理内存使用率太高

当我尝试使用storm使用本地模式运行拓扑时,我收到此错误

mvn compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=my.Topology 

错误是

 ERROR backtype.storm.util - Async loop died! java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 3G > maxPhysicalBytes = 3G 

我该如何解决? 我不知道应该增加哪个物理内存! 如果我在生产模式下运行拓扑,这个错误会消失吗?

UPDATE

 Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: None Maximum Capacity: 32 GB Error Information Handle: 0x0019 Number Of Devices: 4 

我在OpenJDK 8或OpenJDK 9代码库中找不到“物理内存使用率太高”消息,因此我怀疑它来自Apache Storm / Spark正在使用的本机代码库。

如果你能提供一个可以帮助追踪“罪魁祸首”的堆栈跟踪。

以下不是“以证据为基础”……

我不知道我应该增加哪个物理内存!

这取决于实际原因。 可能性包括:

  1. 您的Java堆太小了。
  2. 出于架构原因,您的JVM无法将堆扩展到配置的max; 例如,您正在运行32位JVM,并且不能提供足够大的地址空间。
  3. 操作系统拒绝扩展您的进程内存,因为它没有足够的物理内存或交换空间。
  4. 由于“ulimit”或类似的资源限制,操作系统拒绝扩展您的进程内存。

我希望所有上述内容都有不同的诊断…除了看起来诊断(即错误消息)显然不是来自JVM本身。

上述问题可能由以下原因引起/触发:

  • 可以将各种可配置限制设置得太小
  • 使用32位JVM
  • 你的机器太小了; 即获得更多物理内存!
  • 你的问题太大了。
  • 您的应用程序有错误或泄漏内存。

如果我在生产模式下运行拓扑,这个错误会消失吗?

不可能预测。


更新 – 基于org.bytedeco.javacpp ,很明显错误消息来自org.bytedeco.javacpp库。 特别是Pointer类。 ( 源代码 。)

查看源代码,问题与名为“maxPhysicalMemory”的可配置参数有关,该参数由“org.bytedeco.javacpp.maxphysicalbytes”系统属性配置。

尝试更改该属性。

您可以通过Googling获取更多信息“org.bytedeco.javacpp.maxphysicalbytes”

我也在使用Apache Storm和JavaCV(OpenCV)。 我有两个拓扑,第二个拓扑在这个过程中有两个螺栓,一个用于将video分成帧,另一个用于检测面。

我遇到过同样的问题:

 2017-08-02 11:19:18.578 oasutil Thread-5-OpenCVBolt-executor[3 3] [ERROR] Async loop died! java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes = 1G > maxPhysicalBytes = 1G at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:562) ~[stormjar.jar:?] at org.bytedeco.javacpp.helper.opencv_core$AbstractCvMemStorage.create(opencv_core.java:1649) ~[stormjar.jar:?] at org.bytedeco.javacpp.helper.opencv_core$AbstractCvMemStorage.create(opencv_core.java:1658) ~[stormjar.jar:?] at OpenCVBolt.detect(OpenCVBolt.java:30) ~[stormjar.jar:?] at OpenCVBolt.execute(OpenCVBolt.java:104) ~[stormjar.jar:?] at org.apache.storm.daemon.executor$fn__4973$tuple_action_fn__4975.invoke(executor.clj:727) ~[storm-core-1.0.3.jar:1.0.3] at org.apache.storm.daemon.executor$mk_task_receiver$fn__4894.invoke(executor.clj:459) ~[storm-core-1.0.3.jar:1.0.3] at org.apache.storm.disruptor$clojure_handler$reify__4409.onEvent(disruptor.clj:40) ~[storm-core-1.0.3.jar:1.0.3] at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:453) ~[storm-core-1.0.3.jar:1.0.3] 

我能够解决它。 我不知道你是否使用JavaCV来处理video和图像。 如果是这样,并且您正在使用Maven,请确保在pom.xml中使用JavaCV 1.3.2版:

  org.bytedeco javacv 1.3.2  

然后,您需要在Bolt中的prepare()方法中应用以下行来更改maxPhysicalBytes的属性。

 System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0"); System.setProperty("org.bytedeco.javacpp.maxbytes", "0"); 

这对我有用。 错误消失了。 我希望这可以帮助你。

UPDATE

 @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0"); System.setProperty("org.bytedeco.javacpp.maxbytes", "0"); _collector = collector; } 

我在研究DL4J sentimentRNN时遇到了同样的问题,经过大量研究后,我找到了一个资源,我发现我必须为VM参数添加一些选项

 -Xms1024m -Xmx10g -XX:MaxPermSize=2g 

我相信如果您将-Xms,-Xmx或XX的值调整到您的计算机规格,您将找到适用于您的计算机内存的内容。

我不得不将此添加到我的vm选项:

 -Xms5024m -Xmx10g -XX:MaxPermSize=6g 

我使用了一个有点高规格的PC,上面的选项对我有用,使我的代码运行得更快。

我希望这有帮助

这很可能意味着服务器中的空间不足。 如果它是一个linux盒子,请检查可用内存: –
ps aux --sort -rss这将按RSS值对进程RAM消耗进行排序

RSS:驻留集大小,任务使用的非交换物理内存(以千字节为单位)。

例:-

 zhossain@zhossain-linux1:~$ ps aux --sort -rss USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND zhossain 31934 98.2 8.2 1941088 1328536 pts/4 Rl+ 16:13 1:48 python /local/mnt/workspace/ root 2419 0.1 0.5 241156 88100 ? Sl Apr05 136:00 splunkd -h 127.0.0.1 -p 8089 restart root 1544 0.1 0.3 740048 60820 ? Ssl Feb15 266:43 /usr/sbin/automount root 2486 0.0 0.1 331680 28240 ? S 11:19 0:11 smbd -F root 867 0.0 0.1 257000 27472 ? Ssl Feb15 0:22 rsyslogd colord 1973 0.0 0.0 304988 13900 ? Sl Feb15 1:37 /usr/lib/colord/colord