我在我的本地使用Graphhopper
来获取两个纬度/经度之间的行车方向。一切都很好,当我只为一个国家加载数据时,我得到的结果不到100毫秒。现在我已将数据集加载到Asia
,结果变得太慢(在某些情况下超过10秒)。现在,对于某些路线,我收到了这个错误:
ERROR com.graphhopper.http.GHErrorHandler - GC overhead limit exceeded,
java.lang.OutOfMemoryError: GC overhead limit exceeded
我的目标是加载所有世界数据并在不到1秒的时间内获得结果。我可以做些什么样的性能优化来实现这个目标?
目前我正在使用8 GB RAM
的系统。如果需要优化性能,我愿意增加RAM。
答案 0 :(得分:0)
“超出GC开销限制”消息意味着JVM花费大部分时间进行垃圾回收。这通常意味着堆已接近满。
有两种方法可以解决这个问题:
您可以增加Java堆大小。但是,如果过多地增加堆大小,最终可能会使用比物理RAM更多的虚拟内存。这可以将您的系统推入VM崩溃的模式;即它花费大部分时间在RAM和交换设备之间交换页面。
您可以寻找减少内存使用量的方法。现在我不知道是什么graphhopper,但听起来它是一个应用程序,通过将大型图形加载到内存中。如果是这种情况,那么在不重写应用程序的情况下可能难以减少内存使用量。
最终,任何将大型数据集加载到内存中的应用程序都会遇到超出您可用的物理RAM量的问题。