Avatar billede svarrer Nybegynder
08. september 2005 - 11:37 Der er 26 kommentarer

Program til opsøgning af memory-leak?

Hejsa..

Jeg er blevet sat på en (næsten) umulig opgave:
jeg skal finde en memory-leak i en andens program!
Siderne kører på en tomcat server, og problemet ligger i at, vi bliver nød til at genstarte tomcat serveren hver nat, fordi den tilsyneladende får opbrugt al sin hukommelse.

er der nogen der kender til et program der kan køres og udpege eventuelle memory leaks?.. måske vise hvilke filer der bliver loadet og vokser?!.. så jeg derigennem har en lille chance for at finde frem til hvilke (udaf de 427 filer) der ville være en ide at kigge grundigere på?!.

Alle andre ideer  / forslag til hvor memory leaks normalt opstår -modtages gerne!

på forhånd tak!
Christian
Avatar billede arne_v Ekspert
08. september 2005 - 11:46 #1
der findes forskellige profile tools til Java

der er også nogle forskellige kendte problem stillinger med hensyn til memory
leak i java

men umiddelbart ville jeg nok angribe problemet med:

- få fat i en test maskine og smid alle siderne på den

- brug et tool (hjemme lavet eller fancy færdig load tester) som requester en side
  10000 gange mens du kigger på memory forbruget
Avatar billede dsj Nybegynder
08. september 2005 - 11:54 #2
Jeg kan varmt anbefale OptimizeIt Suite fra Borland, der kan køre standalone og integreret i Borland JBuilder. Med det kan man tage et snapshot af hele heapen, med detaljeret beskrivelser af alle objekter og hvor de er blevet allokeret, referencer imellem dem osv. OptimizeIt kan derefter analysere forskellene mellem to snapshots, og hvis man ved hvilken kode der er afviklet imellem disse snapshots, er det forholdsvis simpelt at se hvor det går galt.

Dog har jeg ikke selv brugt OptimizeIt med JSP. Man skal måske også lige tage i betragtning, at OptimizeIt er kommerciel software, der ikke er helt billigt, men det virker fremragende. Det kan, udover at detecte memory-leaks, også hjælpe med en masse andre problemer, f.eks. at finde deadlocks ved at analysere hvilke monitorer i JVM'en der holdes af hvilke tråde og i hvilken rækkefølge.
Avatar billede svarrer Nybegynder
08. september 2005 - 12:22 #3
tak for de hurtige tilbagemeldinger..

dsj>
Optimize Suite lyder rigtig godt...men så så jeg prisen.. 2600 Euro.. Det får jeg aldrig ud af min chef ! :-(

arne_v>
Ville du bare lave en alm java servlet (f.eks) , og en løkke der ville requeste den samme jsp side 10000 gange?
bare ala forwarde til siden?!
for(int i=0; i<10000; i++)
RequestDispatcher rd = new RequestDispatcher("/minjsp.jsp");
rd.forward();

-Agtigt?! eller hvordan?!

Mvh og på forhånd tak for de gode og hurtige svar!
Christian
Avatar billede arne_v Ekspert
08. september 2005 - 12:28 #4
jeg ville bare lave et lille standalone program som lavede de requests
(med java.netURLConnection og java.net.HttpURLConnection) uden for Tomcat
Avatar billede svarrer Nybegynder
08. september 2005 - 12:41 #5
Måske jeg ikke er helt med så?!.. et alm. java prog. der requester en side 10000 gange. bør en jsp ikke skulle åbnes i en browser?! (er forholdsvis ny mht jsp, kender dog både til java og servlets) hvordan ville du requeste jsp-siden?!
HttpURLConnection con = new HttpURLConnection("/minjsp.jsp");
hvordan requester man den så igen??!.. lukker forbindelsen og opretter den igen!?

Christian
Avatar billede arne_v Ekspert
08. september 2005 - 12:50 #6
jeg plejer at kode noget ligesom:

    private static String download(String urlstr) {
        StringBuffer sb = new StringBuffer();
        try {
            URL url = new URL(urlstr);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = con.getInputStream();
                byte[] b = new byte[1000];
                int n;
                while ((n = is.read(b)) >= 0) {
                    sb.append(new String(b, 0, n));
                }
                is.close();
            }
            con.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
Avatar billede arne_v Ekspert
08. september 2005 - 12:50 #7
den kalder du bare i en løkke

Tomcat er ligeglad med om det er en browser eller et andet program som requester
Avatar billede arne_v Ekspert
08. september 2005 - 12:51 #8
hvis der skal logges ind, maintaines session etc. så skal der en lille bitte
smule mere til
Avatar billede svarrer Nybegynder
08. september 2005 - 13:43 #9
Hvilke små ændringer skulle der til såfremt der var login på siderne?!..

Super tak for alt din hjælp..

Christian
Avatar billede arne_v Ekspert
08. september 2005 - 13:51 #10
afhænger af om det er BASIC eller FORM based authentication
Avatar billede svarrer Nybegynder
08. september 2005 - 13:59 #11
Er rimelig sikker på at det er sessions styret, så hvis man på en eller anden måde kan få en session og sætte ens bruger på denne, så ville det nok løse problemet?!
kender du til en måde at få adgang til sessionen!?!
Avatar billede arne_v Ekspert
08. september 2005 - 14:03 #12
login er under alle omstændigheder sessions styret

spørgmålet er kun hvordan man logger ind

        Authenticator.setDefault(new MyAuthenticator());

hvor:

class MyAuthenticator extends Authenticator {
  protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication("xxxx", "xxxx".toCharArray());
  }
}

er nok til BASIC authentication

mens til FORM based authentication må der skulle laves en POST til en
form + accepteres session cookie
Avatar billede svarrer Nybegynder
08. september 2005 - 14:33 #13
Det er normalt via en HTml form der bliver parset af en servlet, der (såfremt succesfuldt login) sætter en attribute på sessions objektet. De resterende JSP sider kontrollere så at denne (og andre) objekter er sat på sessionen.
Avatar billede arne_v Ekspert
08. september 2005 - 14:40 #14
så er det POST og cookie til at holde session - jeg kan prøve
at bixe et eksempel senere
Avatar billede svarrer Nybegynder
08. september 2005 - 14:42 #15
Det ville være helt super!!

Du er dagens mand i skysovs!
Mvh
Christian
Avatar billede arne_v Ekspert
08. september 2005 - 21:10 #16
jeg kiggede lidt på cookies

der kommer noget smart i java 6.0 til det, men idag er det noget bøvl

så jeg hentede lige HttpUnit fra http://httpunit.sourceforge.net/ og så var det nemt nok

eksempel:

package september;

import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.PostMethodWebRequest;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;

public class FormLogin {
    public static void main(String[] args) throws Exception {
        WebConversation web = new WebConversation();
        // request protected page - will actually get login form
        WebResponse resp = web.getResponse(new GetMethodWebRequest("http://localhost:8080/secure/"));
        System.out.println(resp.getResponseCode() + " " + resp.getContentLength());
        // perform login - will actually get protected page
        WebRequest login = new PostMethodWebRequest("http://localhost:8080/secure/j_security_check");
        login.setParameter("j_username", "tomcat");
        login.setParameter("j_password", "tomcat");
        resp = web.getResponse(login);
        System.out.println(resp.getResponseCode() + " " + resp.getContentLength());
        // request protected page 10 times again
        for(int i = 0; i < 10; i++) {
            resp = web.getResponse(new GetMethodWebRequest("http://localhost:8080/secure/"));
            System.out.println(resp.getResponseCode() + " " + resp.getContentLength());
        }
    }
}
Avatar billede svarrer Nybegynder
12. september 2005 - 12:10 #17
Hej igen..

Tak for al hjælpen!!
findes der et program, (eller kan man forholdsvis nemt lave et) der kan fortælle hvilke class, filer der bliver eksekveret i JVM, og mængden af hukommelse disse bruger.=?! Eneste måde jeg pt kan bruge er ctrl-alt-del og se på hukommelsen der.. det er nok ikk helt nok! ;-)

Christian
Avatar billede arne_v Ekspert
12. september 2005 - 12:41 #18
lav en JSP som vise memory forbruget og har et META tag som får browseren til at
refreshe løbende

kombineret med et load test program som beskrevet overnfor der kalder en side 10000
eller 100000 gange burde du snart vid ehvilken side det er galt med

så kan fejlen muligvis findes bar eved at kigge på koden ellers skal der
nok finere værktøjer til
Avatar billede svarrer Nybegynder
12. september 2005 - 13:05 #19
.. Oki.. ;-)
Takker for hjælpen so far.. Kender du (iøvrigt) til et program der kan lave UML-diagrammer?.. har efterhånden lidt svært ved at danne mig et overblik over hvilke klasser der kalde hvilke og hvordan. (og det er IKKE dokumenteret!)

Christian
Avatar billede arne_v Ekspert
12. september 2005 - 13:18 #20
hvis vi snakker gratis:

ArgoUML
Poseidon Community Edition
Visual Paradigm Community Edition
Jude
Avatar billede svarrer Nybegynder
12. september 2005 - 14:43 #21
Hmm.. nu ville jeg ikk drive rovdrift på din venlighed (samt kunnen) .. men har nu søgt efter muligheder for at læse memory forbruget i jvm. og har ikke fundet en metode fra en jsp-side der kan det?!

hvilken metode skal kaldes?!
/Christian
Avatar billede arne_v Ekspert
12. september 2005 - 15:45 #22
efter hukommelsen:

Runtime.getRuntime().totalMemory()
Runtime.getRuntime().freeMemory()
Avatar billede svarrer Nybegynder
16. september 2005 - 10:01 #23
Hej igen...(på arb igen!)
Tak for sidste svar igen!. ;-)...
Jeg får en noMethodException når jeg forsøger at afvikle koden fra httpUnit:?!?
java.lang.NoSuchMethodError: com.meterware.httpunit.WebResponse.<init>(Lcom/meterware/httpunit/WebClient;Lcom/meterware/httpunit/FrameSelector;Ljava/net/URL;Ljava/lang/String;)V
    at com.meterware.httpunit.DefaultWebResponse.<init>(WebResponse.java:1319)
    at com.meterware.httpunit.DefaultWebResponse.<init>(WebResponse.java:1314)
    at com.meterware.httpunit.DefaultWebResponse.<init>(WebResponse.java:1309)
    at com.meterware.httpunit.WebResponse.<clinit>(WebResponse.java:763)
    at com.meterware.httpunit.FrameHolder.<init>(FrameHolder.java:51)
    at com.meterware.httpunit.WebWindow.<init>(WebWindow.java:239)
    at com.meterware.httpunit.WebClient.<init>(WebClient.java:50)
    at com.meterware.httpunit.WebConversation.<init>(WebConversation.java:46)
    at stressTester.setSessionObjects(stressTester.java:72)
    at startTester.stress(startTester.java:32)
    at startTester.main(startTester.java:22)
Exception in thread "main"

//----Et andet spørgsmål:
Når jeg f.eks kalder den først metode du hjalp med ( den uden login "download()")
Får jeg et andet problem: jeg løber tør for sockets..
hver request åbner et nyt socket uden at få lukket det andet?!.. kunne ikke lige finde metoden til at lukke et socket ?!
dvs at på et tidspunkt kommer den med exceptions om at den ikk kan binde til socket, fordi det allerede er i brug!

Endnu en gang tak for hjælpen!
Christian
Avatar billede arne_v Ekspert
16. september 2005 - 12:28 #24
mystisk - jeg testede koden

----

prøv:

System.setProperty("http.keepAlive","false");
Avatar billede arne_v Ekspert
29. september 2005 - 20:27 #25
kommet videre ?
Avatar billede svarrer Nybegynder
30. september 2005 - 08:45 #26
Hej Arne..

og tak for din hjælp...
Der har ikk været den vilde fremgang i projektet desværre.. dette skyldtes dog flere ting. Jeg er midlertidigt blevet sat på et andet projekt med højere prioritet, samt jeg har fået fortalt min chef at det er en umådelig svær opgave, og der muligvis er brug for et professionelt værktøj.
bla. har jeg fået udviklet den jsp-side der viser forbruget af JVM'en , med og uden Garbage collection.. men ligelidt hjalp det, JVM'en fyldte bare mere og mere...
På hver af de jsp-sider jeg kalder, køres der et js-script der kontrollere om siden er i _top-framen, såfremt den er det (hvilket den vil være når man bare kalder den!?!?!) skal den redirecte til index.html og så er jeg ligevidt! :-( så outputtet fra de kaldte jsp-sider er altså HTML'en fra index siden.

Jeg takker for al din hjælp! den har været uundværlig!

Med venlig hilsen
Christian...(der sikkert snart ryger tilbage på projektet..ARG)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester