我有一个使用com.sun.net.HttpServer
API 实现的简单 Java 服务器应用程序。它几乎每秒接收 REST 请求,读取HashMap
一些文本的大文件,并在一些处理后简单地发回文本。服务器部分看起来像这样:
public class Server implements Runnable {
static final Logger logger = LogManager.getLogger(Server.class);
static int serverPort = 9002;
HttpServer server;
public Server() {
Thread t = new Thread(this);
t.start();
}
public void run() {
try {
server = HttpServer.create(new InetSocketAddress(serverPort), 0);
logger.info("EventRetriever REST server listening to port: " + serverPort);
server.createContext("/getEvents", new MedatadaHandler());
server.setExecutor(null);
server.start();
} catch (IOException e) {
logger.error(e);
}
}
class MedatadaHandler implements HttpHandler {
@Override
public void handle(HttpExchange he) throws IOException {
//...
String response = requestEvents();
he.sendResponseHeaders(200, response.length());
OutputStream os = he.getResponseBody();
os.write(response.toString().getBytes());
os.close();
}
}
//some other functions...
public String requestEvents(){
//read from a HashMap, some processing, creating a JSON and sends it while logging it in file
logger.info(jsonString);
return jsonString;
}
}
}
在作为 docker 容器运行时,我看到内存使用量随着时间的推移而增加,例如平均MB
几秒钟。显然,这里的某个地方发生了内存泄漏。是未使用的对象、j4logger
日志还是诸如此类的东西,我真的不知道。我只是尝试System.gc()
每隔几分钟显式调用一次。它做了一些补救措施,但我不确定问题出在哪里。
有什么问题以及如何解决?
编辑:我怎么知道问题来自程序的这一部分?好吧,我有其他线程负责HashMaps
每 5 分钟填充一次,然后去睡觉。即使那是在睡觉时,我也看到记忆力增加了。唯一的部分是该服务器每秒都在服务。