我将App Engine应用程序从Java 7迁移到Java 8,如 here 所述。
我的App Engine应用程序中调用的端点执行以下步骤:
using java.net.HttpURLConnection
de.l3s.boilerpipe.sax.BoilerpipeSAXInput.BoilerpipeSAXInput
com.google.gson.JsonObject
我注意到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环境。我的假设是否正确?
有没有人对可能的原因有任何想法?
答案 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