2016-07-12 79 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

相关问题