Avatar billede thums Praktikant
16. april 2012 - 15:56 Der er 13 kommentarer og
1 løsning

performance relateret til HashMap

Jeg er ved at lave en server app som skal håndtere omkring 1500 requests i sekunded. Det gør den også men mit problem er at når jeg bruger HashMap får jeg et problem med at GC'en umiddelbart ikke rydder ordentligt op i mine Key's.

Den konklusion er baseret på div. heap-dumps som fortæller mig at java.util.HashMap$KeyIterator let står for 17% af den memory der bliver brugt og den er konstant voksende(memory leak)

Er der en anden type man kunne bruge som byder på samme funktionalitet men som er bedre til at rydde op efter sig selv i 1.6.0?

Jeg ved at JRE'en i 1.7.0 er mere effektiv men grundet andet programmel kan vi ikke opgradere denne.
Avatar billede thums Praktikant
16. april 2012 - 16:19 #1
Det skal siges at jeg kun har fået det til at ske på Linux men koden kunne være.

Map map = new HashMap<Socket, String>()
while(true) {
// accept Socket

// add Socket and output from Socket to map

// do something

// map.remove(Socket)
}
Avatar billede arne_v Ekspert
16. april 2012 - 16:11 #2
Jeg tror ikke paa at der er en bug i HashMap i 1.6 - den klasse er simpelthen for meget brugt til at det ikke ville vaere fundet for lang tid siden.

Kan du poste noget simpelt kode som viser problemet?
Avatar billede arne_v Ekspert
16. april 2012 - 16:24 #3
Hmm.

Der er ikke noget der som bruger iterator!?
Avatar billede arne_v Ekspert
16. april 2012 - 16:25 #4
Bruger du GCJ, OpenJDK, SUN/Oracle eller IBM Java paa Linux?
Avatar billede thums Praktikant
16. april 2012 - 16:29 #5
Der bruges Sun's egen. Eneste Iterator jeg bruger er når jeg beder om keySet() på Map'et. Disse bliver dog øjeblikketligt konventeret til et array da jeg sletter løbende i Map'et som jeg gennemgår det så den tidligere kode er nok rimeligt grovt simplificeret
Avatar billede arne_v Ekspert
16. april 2012 - 16:30 #6
Og der bliver ikke gemt ref til de iteratorer?
Avatar billede thums Praktikant
16. april 2012 - 16:34 #7
Nopes... det er de har kun en levetid på een iteration igennem while løkken
Avatar billede thums Praktikant
17. april 2012 - 16:32 #8
Fandt problemet. GC'eren skulle bruge nogle kald for at gøre det samme som den gør automatisk i windåse. Satte et periodisk kald, til gc(), ind i hver tråd som køre hvert minut, hvilket betyder at den rydder op i den allokerede memory til KeyIterator'er. Det sutter maks røv at skulle klare det på sådan en måde men understøtter blot min teori om at det var JRE'en der slog knuder :-)

Tak for dit indspark Arne_V
Avatar billede thums Praktikant
17. april 2012 - 16:33 #9
Btw. det køre på en Debian til info for andre der måtte støde i det problem.
Avatar billede arne_v Ekspert
18. april 2012 - 01:31 #10
Det lyder som en daarlig loesning.

Hvis GC ikke kan frigoere plads naar den selv vaelger at koere, saa kan den heller ikke frigoere plads naar du beordrer den til at koere.

Og det er generelt ikke godt at blande sig i GC.

Men det rejser jo et interessant spoergsmaal: var der overhovedet et problem foer?

Hvis Java bare mente at der ikke var grund til at koere GC fordi der var masser af memory, saa skulle du jo maaske bare saette Xmx ned.
Avatar billede thums Praktikant
18. april 2012 - 08:36 #11
Er jeg helt enig med dig i Arne men er problemet så ikke at når den peak'er i load så er der det mindre at gøre godt med?
Avatar billede arne_v Ekspert
19. april 2012 - 01:24 #12
Hvis du saetter Xmx ned saa er der mindre at goere godt med.

Xmx skal naturligvis saettes saa det virker ved peak load.

Men sker der noget ved at der er lang tid mellem GC ved lav load?
Avatar billede thums Praktikant
19. april 2012 - 09:14 #13
Der er jo rimeligt konstant pres på den server der køre det så vores overvågning af den er meget tight. Da vores drift folk helst ser at de ikke hele tiden modtager advarsler skal den helst holdes nede :-)
Avatar billede arne_v Ekspert
23. april 2012 - 03:54 #14
Saa den Java app maa godt bruger meget memory naar der er hoej aktivitet men skal bruge lidt memeory naar der er lav aktivitet?
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