Java 应用程序中 io.vertx.core.impl.EventLoopContext 中的内存泄漏

Posted

技术标签:

【中文标题】Java 应用程序中 io.vertx.core.impl.EventLoopContext 中的内存泄漏【英文标题】:Memory Leak in io.vertx.core.impl.EventLoopContext in Java Application 【发布时间】:2018-05-18 09:19:12 【问题描述】:

我们在我们的一个 Java 应用程序中使用 vert.x 工具包(用于在 JVM 上构建反应式应用程序)。过去几天,我们开始看到高内存(堆)使用率,有时会导致应用程序无响应(由于大量 GC CPU 周期使用)。因此,为了调查什么在吃堆内存,我使用了 Eclipse MAT 工具来查找内存泄漏。这就是它所显示的:

不确定代码中实际出了什么问题,因此需要专家在这里提出建议。请在下面找到我的 pom 和顶点代码。如果您需要其他详细信息,请告诉我。我正在关注本指南vertex.io guide & vert.x java code e.g

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);
    );
  

【问题讨论】:

有趣的是,你没有完成任何事情,或者在该示例中使用 Vert.x 在技术上支持你的堆栈......除了使用它。 【参考方案1】:

现在已经解决了!

实际上 3.5.2.CR2 之前的所有版本都存在内存泄漏; 有关更多信息,请检查报告的此问题: https://github.com/eclipse/vert.x/issues/2464 和 fixed commit id 。

所以很快vert.x 将公开发布其 3.5.2 版本。感谢vert.x community。

【讨论】:

以上是关于Java 应用程序中 io.vertx.core.impl.EventLoopContext 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Vert.x使用log4j2

在区分大小写的模式下创建一个带有 uri 的 http 请求

java中搜索插件叫啥

怎么将activiti集成到java应用程序中

怎样在java程序中使用java启动flume

应用程序已被java安全阻止 控制面板中打开JAVA安全选项只有高和非常高,该怎么解决