当我尝试使用
风暴在本地模式下运行拓扑时,出现此错误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
我该如何解决?我不知道应该增加哪些物理内存!如果我在生产模式下运行拓扑,这个错误会消失吗?
更新
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
答案 0 :(得分:2)
我无法找到"物理内存使用率过高" OpenJDK 8或OpenJDK 9代码库中的消息,因此我 suspectt 它来自Apache Storm / Spark正在使用的本机代码库。
如果你能提供一个可以帮助追踪"罪魁祸首的堆栈跟踪"。
以下不是"基于证据的" ...
我不知道我应该增加哪些物理内存!
这取决于实际原因。可能性包括:
我希望对上述所有内容进行不同的诊断...除了看起来诊断(即错误消息)显然不是来自JVM本身。
上述问题可能由以下原因引起/触发:
如果我在生产模式下运行拓扑,这个错误会消失吗?
无法预测。
UPDATE - 基于堆栈跟踪,很明显错误消息来自org.bytedeco.javacpp
库。特别是Pointer
类。 (Sourcecode。)
查看源代码,问题与名为" maxPhysicalMemory"的可配置参数有关。由" org.bytedeco.javacpp.maxphysicalbytes"配置。系统属性。
尝试更改该属性。
您可以通过Google搜索获得更多信息" org.bytedeco.javacpp.maxphysicalbytes"
答案 1 :(得分:2)
我也在使用Apache Storm和JavaCV(OpenCV)。我有两个拓扑,第二个拓扑结构有两个螺栓,一个用于将视频分成帧,另一个用于检测面孔。
我有同样的问题:
2017-08-02 11:19:18.578 o.a.s.util 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来处理视频和图像。如果是这样,并且您正在使用Maven,请确保您在pom.xml中使用JavaCV 1.3.2版:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.3.2</version>
</dependency>
然后,您需要在Bolt中的prepare()
方法中应用以下行来更改maxPhysicalBytes的属性。
System.setProperty("org.bytedeco.javacpp.maxphysicalbytes", "0");
System.setProperty("org.bytedeco.javacpp.maxbytes", "0");
这对我有用。错误消失了。我希望这会对你有所帮助。
<强>更新强>
@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;
}
答案 2 :(得分:1)
我在研究DL4J sentimentRNN时遇到了同样的问题,经过大量研究后,我找到了一个资源,我发现我必须为VM参数添加一些选项
-Xms1024m
-Xmx10g
-XX:MaxPermSize=2g
我确信如果您将-Xms,-Xmx或XX的值调整到您的计算机规格,您将找到适用于您的计算机内存的内容。
我必须将此添加到我的vm选项中:
-Xms5024m -Xmx10g -XX:MaxPermSize=6g
我使用的是高规格的PC,上面的选项对我有用,让我的代码运行得更快。
我希望这会有所帮助
答案 3 :(得分:1)
我在尝试将 Java Tensorflow 从 1.X 升级到 2.X 并且同时使用 Java ZGC
时遇到了非常相似的错误。所以错误看起来像这样:
java.lang.OutOfMemoryError: Physical memory usage is too high: physicalBytes (12288M) > maxPhysicalBytes (12208M)
at org.bytedeco.javacpp.Pointer.deallocator(Pointer.java:700)
at org.tensorflow.internal.c_api.AbstractTF_Tensor.allocateTensor(AbstractTF_Tensor.java:91)
at org.tensorflow.RawTensor.allocate(RawTensor.java:197)
at org.tensorflow.RawTensor.allocate(RawTensor.java:131)
at org.tensorflow.Tensor.of(Tensor.java:88)
at org.tensorflow.Tensor.of(Tensor.java:154)
at org.tensorflow.types.TString.tensorOfBytes(TString.java:170)
这是由于JavaCpp (v1.5.4)(在新的TF Java artifact v0.3.1中使用)在使用ZGC时无法正确计算物理内存使用量,并且它会更多地计算内存比真正使用的,然后抛出这个 OOM 错误 (see info here)。在其他情况下,它也可能无法正确计算内存(see some info here)。
所以解决方案之一是设置JVM系统属性
-Dorg.bytedeco.javacpp.maxBytes=0
也如其他答案所述。基本上它“关闭了 JavaCPP 中的物理字节计数”。虽然这可能会或可能不会带来其他副作用,但我不确定。或者停止使用 ZGC 作为另一种解决方案,因为我们正在使用它。如果 ZGC 与您的情况无关,那么似乎唯一留给您的解决方案就是设置 maxBytes=0
。
其他一些相关信息可以在here中看到。
答案 4 :(得分:0)
这很可能意味着服务器中的空间不足。如果它是一个linux框,请执行此操作以检查可用内存: -
ps aux --sort -rss
这将按RSS值
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