speicherverbrauch steigt stätig....



  • Hallo taurus,

    'VM Size' ist die virtuelle Größe des Programms.
    'Mem Usge' ist der reale Speicherverbrauch.

    Zum Finden von Speicherleaks ist die 'VM Size' oft besser geeignet,
    weil Caching und Auslagerungseffekte hierbei keine Berücksichtigung finden.

    Bitte versuche mal, wie schon erwähnt, die Arbeit deines Programms zu erhöhen
    und ermittle den durchschnittlichen 'VM Size' Anstieg z.B. pro Loop.
    Oft ist die Größenordnung alleine schon ein Hinweis.

    Intressant ist zudem ob du Handle Leaks oder andere Leaks (Threads, files, ...) hast.
    Hierzu kannst du den Taskmanager oder besser den ProcessExplorer verwenden.

    Du kannst nach folgenden Schlüsselwörtern suchen:
    malloc, new, open, init, ...
    und verfolgen, ob es ein passendes
    free, delete, close, exit, ... gibt

    Oft ist es hilfreich eigene Object Memory Zähler einzubauen.
    Man kann dann zu bestimmten Zeitpunkten loggen welche Objekte existieren.

    Mit diesen Mitteln habe ich alle bisherigen Memory leaks gefunden.
    Einfach ist es deswegen aber noch lange nicht!

    Viele Erfolg, Gruß Frank



  • Bitte versuche mal, wie schon erwähnt, die Arbeit deines Programms zu erhöhen
    und ermittle den durchschnittlichen 'VM Size' Anstieg z.B. pro Loop.

    ich kann das leider nicht mehr erhöhen als jede sekunde eine abfrage.., momentan bei 10sec.. sollte aber eigentl reichen...

    Intressant ist zudem ob du Handle Leaks oder andere Leaks (Threads, files, ...) hast.
    Hierzu kannst du den Taskmanager oder besser den ProcessExplorer verwenden.

    ich weiß nicht ob ich das richtig gemacht hab... bin auf "File / Handle " gegangen und habe dort nach "malloc, new, etc. gesucht.."

    gefunden habe ich nichts... ich weiß auch das ich in meinem code kein malloc, new etc verwende

    Oft ist es hilfreich eigene Object Memory Zähler einzubauen.
    Man kann dann zu bestimmten Zeitpunkten loggen welche Objekte existieren.

    versteh ich nicht ganz.. da ehlen mir wohl auch die grundlagen.. zumindest würde ich sagen, ich nutze kein objekte. nur variablen und zeiger...

    ich glaube ich weiß warum der speicher ansteigt.. und zwar wegen den 5 connect versuchen bzw dem verbindungsaufbau...

    5 deshalb weil es sein kann das ein serer zwar erreichbar aber überlastet ist..

    oder? kann es daran liegen??

    wenn ja, dann benutze non-blocking threads.. richtig?
    mit non-blocking kann ich ja sagen. prüfe nach 15sec prüfe nach 30sec usw. richtig?

    oder kann ich nicht einfach den speicher der beim verbindungsaufbau verbraucht wieder zurücksetzen? das muss doch auch gehen? non-blocking threads sind mir zu kompliziert und eigentlich unnötig... ist nämlich egal ob das programm blockiert wird oder nicht...

    //error handling der übersicht rausgemacht...
    
        //Winsock starten
        int connect_handle;
        SOCKET new_socket;
        SOCKADDR_IN addr;     
        WSADATA wsa;
    
        connect_handle = WSAStartup(MAKEWORD(2,0),&wsa);
    
            //Socket definieren
            new_socket = socket(AF_INET,SOCK_STREAM,0);
    
                //addr auf null setzen
                memset(&addr, 0, sizeof(SOCKADDR_IN));
    
                //und wieder füllen
                addr.sin_family = AF_INET;
                addr.sin_port = htons(80);
                addr.sin_addr.s_addr = inet_addr(serverip.c_str());
    
                //Verbindung aufbauen
                bool connect_success = false;
                connect_handle = connect(new_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
    // TRY IT 5 TIMES  ( MAYBE THERE'S A SLOW SERVERS... )
    //************************************************
    //  1. Connect Versuch
    
                if(connect_handle == SOCKET_ERROR) {
    
                    //TRY IT AGAIN
                    connect_handle = connect(new_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
    //************************************************
    //  2. Connect Versuch
    
                    if(connect_handle == SOCKET_ERROR) {
    
                        //TRY IT AGAIN
                        connect_handle = connect(new_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
    //************************************************
    //  3. Connect Versuch
    
                        if(connect_handle == SOCKET_ERROR) {
    
                            //TRY IT AGAIN
                            connect_handle = connect(new_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
    //************************************************
    //  4. Connect Versuch
    
                            if(connect_handle == SOCKET_ERROR) {
    
                                    //TRY IT AGAIN
                                    connect_handle = connect(new_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
    
    //************************************************
    //  5. Connect Versuch
                                    if(connect_handle == SOCKET_ERROR) {
    
                                         closesocket(new_socket);
                                        WSACleanup();
    
                                    } else {
    
                                        connect_success = true;
                                    }
    
                            } else {
    
                                connect_success = true;
                            }
    
                        } else {
    
                            connect_success = true;
                        }
    
                    } else {
    
                        connect_success = true;
                    }
    
                } else {
    
                    connect_success = true;
                }
    

Anmelden zum Antworten