我有一个使用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()
。它有一些补救措施,但是我不确定问题出在哪里。
有什么问题以及如何解决?
编辑:我怎么知道问题出在程序的 this 部分?好吧,我还有另一个线程负责每5分钟填充一次HashMaps
,然后进入睡眠状态。即使在睡觉时,我也会看到内存增加。唯一的部分是该服务器每秒都在服务。