Java 应用程序 io.vertx.core.impl.EventLoopContext 内存泄漏
Memory Leak in io.vertx.core.impl.EventLoopContext in Java Application
我们正在 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);
});
}
}
现在已经解决了!
Actually there was a memory leak to all the versions before 3.5.2.CR2 ;
For more insight check this issue reported :
https://github.com/eclipse/vert.x/issues/2464 and fixed commit id .
所以很快 vert.x will launch its 3.5.2 version publicly. Thanks to vert.x community。
我们正在 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);
});
}
}
现在已经解决了!
Actually there was a memory leak to all the versions before 3.5.2.CR2 ; For more insight check this issue reported : https://github.com/eclipse/vert.x/issues/2464 and fixed commit id .
所以很快 vert.x will launch its 3.5.2 version publicly. Thanks to vert.x community。