2017-06-16 55 views
2

,当我试图使用物理内存占用率过高

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 
+0

为什么'maxPhysicalBytes'是3G?你正在运行一个32位的JVM吗? – Andreas

+0

请问,我如何知道我是否在使用32位JVM?我不知道为什么maxPhysicalBytes是3 GB – prog

+0

你能提供一个完整的堆栈跟踪吗? –

回答

0

这很可能意味着你的服务器运行的空间。如果它是一个Linux机器做这个检查可用内存: -
ps aux --sort -rss这个排序由RSS值

RSS过程RAM消耗:驻留集大小,非交换物理内存任务 已使用(千字节)。

实施例: -

[email protected]:~$ 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 
+0

谢谢,但该命令后我该怎么办?我如何检测问题,我该如何解决? – prog

+0

如果你看到任何进程占用大量内存,请找出那是什么 - 尝试杀死它以释放一些资源以用于你的操作 – Zakir

+0

我试图杀死花费很大但仍然出错的进程 – prog

1

我不能找到一个“物理内存的使用是过高”在OpenJDK的8或9的OpenJDK基本代码信息,所以我suspectt它是从一个未来Apache Storm/Spark正在使用的本机代码库。

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

下面是不是“循证” ......

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

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

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

我期望所有上述诊断都不同,只是它看起来像诊断(即错误消息)显然不是来自JVM本身。

上述问题可引起/由触发:

  • 各种可配置限制可能已被设置过小
  • 使用一个32位的JVM
  • 你机在物理上是太小;即获得更多的物理记忆!
  • 您的问题太大。
  • 你的应用程序是越野车或内存泄漏。

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

不可能预测。


UPDATE - 基于堆栈跟踪,该错误消息来自org.bytedeco.javacpp库很明显。具体是Pointer类。 (Sourcecode

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

尝试更改该属性。

您可以通过谷歌搜索 “org.bytedeco.javacpp.maxphysicalbytes”

+0

感谢你的回答,但我认为我使用的算法存在问题,因为它需要高内存。所以我认为我能够增加身体的大小,我不知道它是否是RAM?我的笔记本电脑corei5与RAM8GB。我可以增加RAM吗?或者我不能? – prog

+0

那么这个消息说它只使用3GB ......所以这表明物理内存不是问题。你能扩展你的笔记本电脑的内存吗?取决于硬件。检查制造商的规格。 –

+0

如果你愿意,你能告诉我如何增加它?我在Ubuntu 14.04LTS – prog

1

我还使用Apache的风暴与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> 

然后,你需要在你博尔特适用于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; 
} 
+0

非常感谢您的回复,我不使用JavaCV。我正在处理文本。还有其他方法可以尝试吗?关于你的错误,你通过更改javacv版本来解决它,并在螺栓中放置一些配置。所以问题不在RAM内存中,只是应该做一些改变! – prog

+0

无论您是否使用JavaCV,我认为如果您的Bolt,prepare()方法与上面的一样(我更新了我的消息),那么错误消息将会消失。 – MarcosDM