Java 8迁移(Google App Engine)

时间:2018-02-01 15:43:12

标签: java google-app-engine google-cloud-platform

我将App Engine应用程序从Java 7迁移到Java 8,如 here 所述。

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

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

我注意到Java 8的性能急剧恶化。

使用App Engine控制台图表,我发现延迟有很大差异。 使用Java 7,延迟大约为5秒。 使用Java 8,延迟大约为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"

Java 8版

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" 

澄清在我的本地App Engine环境(在我的本地计算机上)上运行一些测试非常有用,我在Java 7和Java 8之间执行时没有发现任何差异。 因此在我看来,问题不是来自Java版本,而是来自运行两个版本的App Engine环境。我的假设是否正确?

这是Java 7版本的延迟图: enter image description here

和Java 8版本: enter image description here

有没有人对可能的原因有任何想法?

3 个答案:

答案 0 :(得分:1)

阅读https://cloud.google.com/appengine/docs/standard/java/issue-requests

你必须在你的appengine-web.xml中将url-stream-handler添加为urlfetch;

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

答案 1 :(得分:0)

我已完成相同的迁移,但我没有注意到任何性能下降。

我注意到的事情是,在Java 8中,它允许制作后台线程。对于某些调用,那些线程会在实际请求完成后继续运行。这需要更长时间打开请求。也许你有类似的东西? (应该在日志中可见一些)

答案 2 :(得分:0)

这可能是由于App Engine实例类的内存/ CPU限制所致。请查看此问题以获取更多信息:Memory Error/500 Error when migrating from Java 7 to Java 8 on Google App Engine