Unix, Java & lsof

2 respostas
smota

Ae Pessoal,

Tenho uma aplicação em Java que fica em loop e basicamente abre um punhado de arquivos para processar e internamente utiliza uma API que conecta a um servidor via TCP … o problema é que listando os arquivos abertos meu processo está abrindo, abrindo e abrindo e no fim estoura o limite do SO (flamigerado “too many open files”) …

Mas nao são fds dos arquivos e sim de conexoes TCP listadas com o lsof:
java 19123 root 13u STR 21,0x680005 0t0 87 /dev/tcp->tcpm->ip

Quem abre a conexao é a api e eu garanto que estou mandando ela fechar :-o

Anyway … para os gurus do SO: tem como eu identificar mais informacoes a respeito do owner deste file descriptor?

qualquer dica de como rastrear será bem vinda …

Obrigado

2 Respostas

louds

Eu usei essa técnica uma vez pra achar e corrigir resource leaks em uma aplicação.

Pega o aspectwerks e cata uns aspectos pra logar sempre q um socket ou um arquivo for aberto ou fechado, coloca um mixin pra fazer correlação entre arquivo -> stack-trace que voce consegue extrair bastante dados.

Se vc tiver realmente com vontade, usa o JDK 5.0 e expoe esses dados via JMX.

Para fazer, essa solução toda leva uns 10min se voce conhecer como usar AW e JMX ou umas 2 horas se não souber.

smota

:shock: Cool!

Que ótima aplicação para AOP … vou tentar (tentar já que que a API é apenas um wrapper JNI para uma biblioteca) … valeu

Criado 25 de novembro de 2004
Ultima resposta 26 de nov. de 2004
Respostas 2
Participantes 2