2017-06-16 90 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