我已经创建了一个围绕Java的
我安装了一个
当使用curl连接服务器时,服务器会做出响应,但Java进程仍在使用整个核心,因此导致服务器无法响应。
正是这行代码引发了这个问题:
如果我们移除这行代码,服务器仍然可以正常工作。
从文档中得知:
为了正确终止每个交换,即使不发送响应主体,输出流也必须关闭。
我已经创建了一个项目来复现这个问题。
到目前为止,我发现了一些潜在的线索:
HttpsServer
的最小应用程序。我安装了一个
HttpHandler
,它会回复一个短文本消息来响应请求:return exchange -> {
try {
OutputStream responseBodyStream = exchange.getResponseBody();
byte[] response = "Trouble with HTTPS and curl\n"
.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().set("Content-Type", "text/plain");
exchange.sendResponseHeaders(200, response.length);
responseBodyStream.write(response);
responseBodyStream.close();
// Note that exchange.close() also closes the exchange's input stream
// and output stream
} catch (Exception e) {
log.warn("Could not handle request", e);
}
};
当使用curl连接服务器时,服务器会做出响应,但Java进程仍在使用整个核心,因此导致服务器无法响应。
正是这行代码引发了这个问题:
responseBodyStream.close();
如果我们移除这行代码,服务器仍然可以正常工作。
从文档中得知:
为了正确终止每个交换,即使不发送响应主体,输出流也必须关闭。
我已经创建了一个项目来复现这个问题。
到目前为止,我发现了一些潜在的线索:
- 只有使用curl连接服务器时才会出现高CPU使用率。使用Firefox连接时,CPU使用率保持较低
- 当使用没有TLS的常规HTTP服务器时,不会出现此问题
- 使用Flight Recorder收集的数据表明,
HTTP-Dispatcher
线程中的SSLEngineImpl#writeRecord
分配了大量对象。
我正在使用Arch Linux 5.1.7操作系统,OpenJDK 12.0.1+12版本。curl的版本为7.65.1。
这是JDK的一个bug吗?还是我错误地使用了HttpsServer
?