当我关闭插槽时,内存使用率高于我没有关闭的插槽

问题描述

我想检查后端的健康状况,如果后端死了,我将停用该后端。

我使用ThreadPool启动线程,每10秒钟使用ip +端口ping我的后端。

通过使用Socket类,我首先不会关闭套接字。

   Socket socket = new Socket();
   InetSocketAddress address = new InetSocketAddress(domain,port);
   try {
     socket.connect(address,3000);
     if (socket.isConnected()) {
       successCount++;
     }
   } catch (IOException e) {
     e.printstacktrace();
   }

然后我关闭插座。

Socket socket = new Socket();
InetSocketAddress address = new InetSocketAddress(domain,port);
try {
  socket.connect(address,3000);
  if (socket.isConnected()) {
    successCount++;
  }
} catch (IOException e) {
  e.printstacktrace();
} finally {
  try {
    socket.close();
  } catch (IOException e) {
    e.printstacktrace();
  }
}

我想找到这种条件在内存使用上的区别。

我使用 jconsole 显示内存使用情况。

但是我发现如果我关闭套接字,内存的使用率会比不关闭它高。

这是有关内存的图片。我想知道为什么。 enter image description here

private void backendHealthCheck() {
    Map<String,Boolean> backendHealthMap = new ConcurrentHashMap<>();
    List<ProxyBackendConfiguration> allBackends = gatewayBackendManager.getAllBackends();
    for (ProxyBackendConfiguration backend : allBackends) {
      String backendName = backend.getName();
      Boolean backendStatus = gatewayBackendManager.getBackendStatus(backendName);
      log.debug("[{}] 对应的后端状态为 [{}]",backendName,backendStatus);
      backendHealthMap.put(backendName,backendStatus);
    }
    scheduledexecutorservice.scheduleWithFixedDelay(
        () -> {
        log.info("Check the backend's healthy condition");
        List<ProxyBackendConfiguration> backends = gatewayBackendManager.getAllBackends();
        for (ProxyBackendConfiguration backend : backends) {
          int successCount = 0;
          String domain = backend.getProxyTo().substring(8,36);
          int port = Integer.parseInt(backend.getProxyTo().substring(37,41));
          String backendName = backend.getName();
          for (int i = 0; i < 7; i++) {
            Socket socket = new Socket();
            InetSocketAddress address = new InetSocketAddress(domain,port);
            try {
              socket.connect(address,3000);
              if (socket.isConnected()) {
                successCount++;
              }
            } catch (IOException e) {
              e.printstacktrace();
            }
            if (successCount >= 2) {
              // if the backend is active then break,else active this backend
              // if this is not in map,get false active this backend
              // if this backend in this map,and status is false,then active this backend
              if (!backendHealthMap.getorDefault(backendName,false)) {
                gatewayBackendManager.activateBackend(backendName);
                backendHealthMap.put(backendName,true);
              }
              break;
            }
            if (i == 6) {
              // if this backend in map and the status is false,continue
              // if this backend is not in map,get status is true,then deactive this backend
              // if this backedn in map,and status is true,then deactive this backend
              if (backendHealthMap.getorDefault(backendName,true)) {
                gatewayBackendManager.deactivateBackend(backendName);
                backendHealthMap.put(backendName,false);
              }
            }
          }
        }
      },10,TimeUnit.SECONDS);
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)