在Java中初始化新的套接字会增加RAM使用率

例外

如果连接关闭,我将使用以下方法保持连接的活动状态。我注意到,当它运行了一周并且有数百个套接字在运行时,RAM使用量增加了700 MB。难道我做错了什么?

如果它运行一周而不需要初始化太多新的套接字,则RAM使用率会降低。

import ws.JettyWebSocketClient;

public class connectionKeeper extends Thread {
public void run(){

    lib.print(">>> Connection thread running");


    do{

        lib.writeLog("Opening new websocket connection");

        try{

            GVL.socketCounter++;

            GVL.ws = new JettyWebSocketClient();

            GVL.ws.run();

        }catch(Exception e){
            e.printStackTrace();
            lib.error("Error: connectionKeeper: " + e.toString());
        }

        // if we are here, we got an error or the socket has executed the run() -method to end          
        lib.sleep(2000);

    }while(true);
}

}

--

public class JettyWebSocketClient {

private boolean connected=false;
private WebSocketClient client=new WebSocketClient();

public void run() {

    MyWebSocket socket = new MyWebSocket();

    ClientUpgradeRequest request;

    URI destinationUri = null;
    try {
        destinationUri = new URI("wss://example.com:3000/ws");
    } catch (URISyntaxException e1) {
        e1.printStackTrace();
        lib.error("Jetty.runA(): " + e1.toString());
    }

    SslContextFactory sslContextFactory = new SslContextFactory();
    Resource keyStoreResource = Resource.newResource(this.getClass().getResource("/cert.jks"));
    sslContextFactory.setKeyStoreResource(keyStoreResource);
    sslContextFactory.setKeyStorePassword("pass");

    client=new WebSocketClient(sslContextFactory);

    connected=false;

    try {
        client.start();
        request = new ClientUpgradeRequest();
        System.out.println("SOCKET" + GVL.socketCounter+ ":\tConnecting to " + destinationUri.toString());
        client.connect(socket, destinationUri, request);

        do{
            socket.awaitClose(10);
        }while(connected);

    } catch (Throwable t) {
        t.printStackTrace();
        lib.error("Jetty.runB(): " + t.toString());
    }

}


public boolean send(JSONObject message){

    String msg=message.toString();
    System.out.println("SOCKET" + GVL.socketCounter+ ":\tSending msg:\t" + msg);

    for(Session s: client.getOpenSessions()) {
        if (s.isOpen()) {
            try {
                s.getRemote().sendString(msg);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                lib.error(e.toString());
            }
        }
    }

    return false;
}

public String status(){
    return this.client.getState();
}

public boolean isConnected() {
    return connected;
}

public void disconnect(){

    lib.print("Disconnecting...");

    setConnected(false);

    try {

        try{
            client.stop(); 
        } catch (InterruptedException e) {
//   sometimes it gets here, sometimes not.. hmm
        }


    } catch(Exception a){
        lib.error("Jetty.disconnect():\t" + a.toString());
    }

    lib.print("Disconnected...");
}

public void setConnected(boolean newval) {
    connected=newval;
}

@WebSocket
public class MyWebSocket {


    private final CountDownLatch closeLatch = new CountDownLatch(1);

    @OnWebSocketConnect
    public void onConnect(Session session) {

        System.out.println("SOCKET" + GVL.socketCounter+ ":\tCONNECTED");
        setConnected(true);

    }

    @OnWebSocketMessage
    public void onMessage(String message) {
        messaging.handleMsg(message); // this method uses received data to calculate some things
    }

    public void onError(int statusCode, String reason){
        lib.error("SOCKET" + GVL.socketCounter+ ":\tError:\t" + reason + " / Code: " + statusCode);
    }

    @OnWebSocketClose
    public void onClose(int statusCode, String reason)  {
        lib.error("SOCKET" + GVL.socketCounter+ ":\tClosed:\t" + reason + " / Code: " + statusCode);

        setConnected(false);

     }

    public void awaitClose(int n) {
        try {
            this.closeLatch.await(n, TimeUnit.SECONDS);
        } catch (Exception e) {
            e.printStackTrace();
            lib.error("SOCKET" + GVL.socketCounter+ ": Jetty.awaitClose():" + e.toString());

            disconnect(); // useless?
        }
    }
}

}
乔基姆·埃德菲尔特(Joakim Erdfelt)

不要继续创建该WebSocketClient对象,只需创建其中一个并在需要时重新连接即可。

可以将其WebSocketClient视为浏览器。

  • 每次client.start()启动该浏览器时。
  • client.connect()在您打开新网页的标签页时,每次操作

昂贵的操作,启动浏览器,一遍又一遍。便宜的操作,连接到网站,打开新标签页,关闭其他标签页,您却没有做。相反,您将进入“当场,我需要重新连接,让我停止浏览器,然后重新启动以重新连接”

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在java中延迟初始化套接字?

安装4GB RAM会增加处理器使用率

Java raytracer 增加 CPU 使用率

RAM使用率

在初始化套接字的ObjectInputStream块

初始化套接字对象

lpop为什么会增加Redis CPU使用率?

Java 17 應用程序在 docker 中顯示出非常高的 RAM 使用率

Java中的CPU使用率太低

如何使用标准套接字对象初始化“MySocket”对象?

结构变量初始化后,结构中的const变量会进入RAM吗?

Windows 10缓慢增加2台不同PC上的RAM使用率

将文件移动到/ dev / shm ramdisk不会增加RAM使用率吗?

C++ 套接字错误(新的初始化表达式列表被视为复合表达式)

即使销毁了套接字,Node.js的内存使用率仍然很高

套接字服务器内存使用率上升,变得无响应

使用优化的只写方式的Openpyxl会大大增加excel文件的磁盘使用率

运行应用程序时,为什么Eclipse CPU使用率会增加?

为什么我不写CockroachDB的磁盘使用率也会增加?

RAM使用率不断攀升

获取CPU和RAM使用率

测量程序的RAM使用率

安装4个操作系统是否会影响我的RAM使用率?

使用内部类中的方法而没有使用new关键字进行对象初始化是否会导致C#Winforms中的内存泄漏

您如何在堆上初始化线程?(使用“新”关键字)

为什么不能使用new关键字在Java中初始化抽象类?

在Python中初始化新实例

使用新的Array()初始化* ngFor

如何在Java中初始化变量/增加“回合”次数-入门,需要帮助