Java 8迁移后性能急剧下降(Google App Engine)

Java 8迁移后性能急剧下降(Google App Engine),java,google-app-engine,google-cloud-platform,Java,Google App Engine,Google Cloud Platform,我将我的应用程序引擎应用程序从Java 7迁移到Java 8,如所述 my App Engine应用程序中被调用的端点执行以下步骤: 使用java.net.HttpURLConnection执行HTTP请求 从使用de.l3s.boilerpipe.sax.BoilerpipeSAXInput.BoilerpipeSAXInput检索的网页中提取文本 创建一个json对象,其中包含一些与使用com.google.gson.JsonObject访问的网页相关的字段 返回响应中的json 我注意

我将我的应用程序引擎应用程序从Java 7迁移到Java 8,如所述

my App Engine应用程序中被调用的端点执行以下步骤:

  • 使用java.net.HttpURLConnection执行HTTP请求
  • 从使用de.l3s.boilerpipe.sax.BoilerpipeSAXInput.BoilerpipeSAXInput检索的网页中提取文本
  • 创建一个json对象,其中包含一些与使用
    com.google.gson.JsonObject访问的网页相关的字段
  • 返回响应中的json
我注意到Java8的性能急剧下降

使用AppEngine控制台图表,我注意到延迟有很大的不同。 使用Java7,延迟大约为5秒。 使用Java8,延迟大约为15秒

通过选择两个代表平均延迟时间的请求,我从日志中提取了以下信息。第一个用于Java 7版本上的请求,第二个用于Java 8版本上的请求

Java 7版本:

protoPayload.startTime: "2018-02-04T02:31:42.824065Z"    
protoPayload:.endTime: "2018-02-04T02:31:43.447840Z"   
latency: "0.623775s"
receiveTimestamp: "2018-02-04T02:31:43.799013964Z"  
timestamp: "2018-02-04T02:31:42.824065Z"
Java8版本

startTime: "2018-02-01T14:52:07.695316Z" 
endTime: "2018-02-01T14:52:09.623029Z" 
latency: "1.927713s"
receiveTimestamp: "2018-02-01T14:52:09.693218406Z"  
timestamp: "2018-02-01T14:52:07.695316Z" 
澄清一下,在我的本地应用程序引擎环境(在我的本地机器上)上运行一些测试,我没有注意到Java 7和Java 8的执行时间有任何差异。 因此,在我看来,问题不在于Java版本,而在于运行这两个版本的应用程序引擎环境。我的假设正确吗

这是Java 7版本上的延迟图:

在Java 8版本上:


有人知道可能的原因吗?

我做了相同的迁移,但没有发现任何性能下降

我注意到的是,在Java8中,它允许生成后台线程。对于某些调用,这些线程在实际请求已经完成后继续运行。这使得请求的打开时间比需要的时间长。也许你有这样的东西?(应该在日志中可见)

读取

您必须将url流处理程序作为urlfetch添加到appengine-web.xml中作为

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <!-- ... -->
  <url-stream-handler>urlfetch</url-stream-handler>
  <!-- ... -->
</appengine-web-app>

urlfetch

这可能是由于App Engine实例类的内存/CPU限制造成的。查看此问题了解更多信息:

我从日志中添加了显示java 8最高延迟的信息,以及来自测试的其他信息。在我看来,问题并不是来自java版本,而是可能来自于环境应用程序引擎,而这两个版本的runI还不能确定原因。我在Java7和Java8上分别执行了一个将流量拆分为50%和50%的测试,并附上了相应的延迟图。软件是一样的。唯一的区别是appengine-web.xml中的“java8”谢谢!根据你的建议,我解决了这个问题。但有两件事我不明白:1)在我的代码中,我使用java.net.HttpURLConnection进行HTTP(S)请求,而不是URL获取API。那么,为什么我必须在appengine-web.xml中插入要获取的标记呢?2) google文档讨论了三个“使用Java标准而不是Java8中的URL获取的优点”,但没有提到延迟的缺点。