Утечка памяти в io.vertx.core.impl.EventLoopContext в приложении Java - PullRequest
0 голосов
/ 18 мая 2018

Мы используем набор инструментов vert.x (для создания реактивных приложений на JVM) в одном из наших приложений Java.В последние несколько дней мы начали наблюдать высокое использование памяти (кучи), которое иногда приводит к тому, что приложение перестает отвечать на запросы (из-за интенсивного использования цикла ЦП ГХ).Итак, чтобы выяснить, что такое кучная память, я использовал инструмент Eclipse MAT для поиска утечек памяти.Вот что он показывает:

enter image description here

Не уверен, что на самом деле идет не так в коде, поэтому нужно, чтобы эксперты посоветовали здесь.Пожалуйста, найдите мой код pom и вершины ниже.Дайте мне знать, если вам нужны другие детали.Я следую этому руководству vertex.io guide & vert.x Java-код, например

Pom.xml

        <groupId>io.vertx</groupId>
        <artifactId>vertx-core</artifactId>
        <version>3.3.3</version>

Запрос кода обработчика с использованием io.vertex:

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import io.vertx.core.Vertx;
import io.vertx.core.WorkerExecutor; 

public class Processor {

private static final Map<String, WorkerExecutor> executorMap = new ConcurrentHashMap<>();

public WorkerExecutor getWorkerExecutor(String threadName, Vertx vertxObj) {
    WorkerExecutor executor = executorMap.get(threadName);
    if (executor == null) {
        synchronized (Processors.class) {
            executor = executorMap.get(threadName);
            if(executor == null){
                executor = vertxObj.createSharedWorkerExecutor(threadName);
                executorMap.putIfAbsent(threadName, executor);
            }
        }
    }
    return executor;
}

@POST
@Path("/update_record")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON })
public void processUpdateEvent(String data, @Suspended final AsyncResponse asyncResponse, @Context Vertx vertx) throws Exception{
    logger.info("update called");
    WorkerExecutor executor = getWorkerExecutor("update_record_event", vertx);
    executor.executeBlocking(future -> {
        MyProcessor processor = (MyProcessor) MainClass.context.getBean("myprocessorevent");
        try {
            processor.processMessage(data);
            future.complete();
        } catch (Exception e) {
            logger.error("consuming event failed: " + e.getMessage());
            future.fail(e);
        }
    }, res -> {
        Response response  = null;
        if(res.succeeded()) {
            response = Response.status(Response.Status.OK).build();
        } else {
            response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
        }
        asyncResponse.resume(response);
    });
  }
}

1 Ответ

0 голосов
/ 23 мая 2018

Теперь это исправлено!

На самом деле произошла утечка памяти во всех версиях до 3.5.2.CR2;Для более детальной проверки, эта проблема сообщила: https://github.com/eclipse/vert.x/issues/2464 и фиксированный идентификатор фиксации .

Так что очень скоро vert.x запустит 3,5.2 версия публично.Спасибо vert.x сообществу .

...