代码之家  ›  专栏  ›  技术社区  ›  Abhishek

Java应用程序中的IO.VTTX.COR.IMP.EntError上下文中的内存泄漏

  •  0
  • Abhishek  · 技术社区  · 7 年前

    我们正在使用一个Java应用程序中的VRT.x工具包(用于构建JVM上的无功应用程序)。过去几天,我们开始看到内存(堆)使用率很高,有时会导致应用程序没有响应(由于GC CPU周期使用率很高)。所以为了研究占用堆内存的因素,我使用EclipseMat工具来查找内存泄漏。这说明了:

    enter image description here

    不知道代码中到底出了什么问题,所以需要专家建议。请在下面找到我的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);
        });
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Abhishek    7 年前

    这已经解决了!

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

    所以很快 vert.x 将公开发布其3.5.2版本。多亏了 vert.x community .