0

我有一个使用com.sun.net.HttpServerAPI 实现的简单 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 分钟填充一次,然后去睡觉。即使那是在睡觉时,我也看到记忆力增加了。唯一的部分是该服务器每秒都在服务。

4

0 回答 0