我的Java服务器应用程序中的内存泄漏

时间:2019-03-30 02:04:37

标签: java memory-management memory-leaks garbage-collection com.sun.net.httpserver

我有一个使用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,然后进入睡眠状态。即使在睡觉时,我也会看到内存增加。唯一的部分是该服务器每秒都在服务。

0 个答案:

没有答案