2016-07-12 78 views
0

我在本地使用Graphhopper獲取兩個緯度/經度之間的行車方向。一切都很好,當我只爲一個國家裝載數據時,我在不到100ms的時間內獲得了結果。現在我已經將數據集加載到了Asia,結果變得太慢了(有些情況下超過了10秒)。而現在的一些途徑我得到這個錯誤:錯誤com.graphhopper.http.GHErrorHandler - 超出GC開銷限制

ERROR com.graphhopper.http.GHErrorHandler - GC overhead limit exceeded, 
       java.lang.OutOfMemoryError: GC overhead limit exceeded 

我的目標是加載所有的世界的數據,並在不到1秒得到結果。我可以通過哪些性能優化來實現這一目標? 目前我使用的系統是8 GB RAM。如果需要優化性能,我打算增加內存。

+0

您擁有哪個數據訪問設置,創建的graphhopper文件夾有多大(或發佈了完整的config.properties)。對於JVM的Xmx&Xms設置,使用此大小+ 10%。 – Karussell

+0

例如如果你想快速的結果,那麼你應該**不**使用內存映射設置(MMAP_SYNC_STORE) – Karussell

+0

嘿謝謝你的迴應。增加Xmx和Xms確實有幫助。那麼大概需要多少物理內存來處理全世界的數據呢?這種情況下推薦的設置是什麼? – Rahul

回答

0

「超出GC開銷限制」消息意味着JVM花費大部分時間進行垃圾回收。這通常意味着堆已接近完整。

有兩種方法可以解決這個:

  • 你可以增加Java堆的大小。但是,如果太多增加堆大小,最終可能會使用比物理RAM更多的虛擬內存。這可能會將您的系統推入虛擬機宕機的模式;即其大部分時間花費在RAM和交換設備之間交換頁面。

  • 您可以尋找方法來減少內存使用量。現在我不知道graphhopper是什麼,但它聽起來像是一個通過將大圖加載到內存中的應用程序。如果是這種情況,那麼可能很難減少內存使用量,而不用重寫應用程序。

最終,加載大型數據集到內存中的任何應用程序都將有尺度超出你有可用的物理RAM量的問題。

+0

目前這是我的設置JAVA_OPTS = -Xmx4000m -Xms4000m -server。他們有一個演示服務器,其中相同的路由在不到1秒內到達。檢查這個:https://graphhopper.com/maps/。而當我嘗試在我的服務器上運行它時間太長。另外,我禁用了交換。我會嘗試檢查不同的堆大小設置。 – Rahul

相關問題