[Java] Too many open files

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Parasietje
  • Registratie: Juli 2004
  • Laatst online: 10-06-2024
Ik draai een JBoss application server. In die application server draaien een aantal EARs, en ook een James mailserver.

Af en toe heb ik de volgende foutmelding:
code:
1
java.io.FileNotFoundException: /vtk/web/www/stylesheets/menubuilder.xsl (Too many open files)


Op dat moment kan de JBoss server de deployment directory ook niet meer openen, en loopt alles in het honderd. De EAR-code en de website herstellen zich echter, maar James (de mailserver) wordt afgesloten en blijft neer.

Net voor dit gebeurde, werden heel veel shell-processen na elkaar gestart. Ook werden er een heleboel files geopent, en deze File-objecten werden ook gepersist in de appserver.


Nu is mijn gok dat het volgende gebeurt (in pseudo-code):
code:
1
2
3
File aFile;
aFile.open();
persist(aFile);

Ik denk dat de file-descriptor nooit vrijgegeven wordt, omdat aFile nooit ge-GCd wordt, en dus ook nooit gefinalize()'t. De garbage collector denkt niet dat het nodig is om te collecten, dus een Runtime.gc() zal ook niets doen. Er is immers geheugen genoeg; er zijn te weinig FILE DESCRIPTORS.

Wat zijn jullie idee-en hierover? Is er een manier in java om alle open file descriptors te zien?

WebDAV in Vista is horribly broken. Ik wil het fixen, maar ben nog steeds op zoek naar de tarball met de source...


Acties:
  • 0 Henk 'm!

  • datajuggler
  • Registratie: Juli 2009
  • Laatst online: 10-08 18:45
Je bent als devver zelf verantwoordelijk voor het closen van je streams, ben je er 100% zeker van dat je streams ook gesloten worden? Volgens je pseudocode niet...

Een file object is slechts een referentie naar een file, meer niet. Waarom sla je niet enkel het pad op in je databank en manipuleer je de file later pas wanneer je het nodig hebt?

Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 14:35
Aangezien je op een unix-achtige of Linux systeem werkt kan je met het "lsof" (list open files) commando zien welke bestanden open zijn. Met "ulimit -a" (in Bash) kan je zien wat de limiet is voor het aantal tegelijkertijd open bestanden (dit is mogelijk anders ingesteld voor de user waaronder JBoss draait).

Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14:19

Robtimus

me Robtimus no like you

sander.devos schreef op maandag 30 november 2009 @ 19:34:
Je bent als devver zelf verantwoordelijk voor het closen van je streams, ben je er 100% zeker van dat je streams ook gesloten worden? Volgens je pseudocode niet...
Klopt. Het is dan ook erg normaal om dit soort code in een try-finally te zetten:
Java:
1
2
3
4
5
6
7
8
9
InputStream is = new FileInputStream(aFile);
try
{
    // doe iets met is
}
finally
{
    is.close();
}
Als je de mogelijke IOException niet wilt throwen maar catchen dan zet je daar nog een try-catch omheen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try
{
    InputStream is = new FileInputStream(aFile);
    try
    {
        // doe iets met is
    }
    finally
    {
        is.close();
    }
}
catch (IOException e)
{
    // handel af
}

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 17-09 12:57

_Erikje_

Tweaker in Spanje

hoerige code in mijn ogen. Lees de tutorial op de sun site nog een keer goed door.

Java:
1
2
3
4
5
6
7
8
9
try{
... code die mogelijk een exception gooit
}
catch(Exception e){
... 
}
finaly{
... wordt altijd uitgevoerd!
}


nvm
oeps. is.close() kan ook een IOStreamException gooien... te lang geen Java geschreven

[ Voor 11% gewijzigd door _Erikje_ op 30-11-2009 21:07 ]


Acties:
  • 0 Henk 'm!

  • Parasietje
  • Registratie: Juli 2004
  • Laatst online: 10-06-2024
Het probleem is opgelost. Blijkbaar opent 'Runtime.getRuntime().exec(command)' automatisch streams voor stdin, stdout en stderr.

For prosperity:
code:
1
2
3
4
5
6
7
8
9
10
11
// FOUT
Runtime.getRuntime().exec(command);

// GOED
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
p.destroy(); // closes stdin, stderr and stdout

// OF OOK
final Process p = Runtime.getRuntime().exec(command);
new Thread() { public void run() { p.waitFor(); p.destroy(); } }.start();

WebDAV in Vista is horribly broken. Ik wil het fixen, maar ben nog steeds op zoek naar de tarball met de source...

Pagina: 1