estou com problemas na leitura desse arquivo, acontece que quando o arquivo é pequeno, ele funciona mais quando adiciona um arquivo maior comeca a dar erros na thread! Estou trabalhando com Pool de Threads e nao sei oque esta ocorrendo! Alguem tem uma ideia melhor ?
intpoolSize=Integer.parseInt(args[3]);// NUMERO DE THREADS MAXIMA EM EXECUCAOExecutorServicetpes=Executors.newFixedThreadPool(poolSize);FileReaderler=newFileReader(newFile(args[0]));// AQUI É O ARQUIVO QUE ESTA DANO PROBLEMA QUANDO e maior de 2mbBufferedReaderorigem=newBufferedReader(ler);Stringlinha=null;while((linha=origem.readLine())!=null){tpes.execute(newRepete(linha,args[1],args[2]));}tpes.shutdown();
Aqui algumas exceptions q lanca, o problema que mesmo setano um numero pequeno de threads contnia esse erro!
Uma forma de você resolver um problema é simplificá-lo primeiro, e depois ir complicando o problema aos poucos.
O que ocorre se você mudar essa leitura para não usar threads?
Se continuar a ocorrer o “OutOfMemory” o problema não é das threads e sim do jeito que você está trabalhando (criando um “new Repete (…)”).
ViniGodoy
O erro não te diz nada?
Está faltando memória na leitura do seu arquivo.
Você pode usar um profiler para monitorar o uso de memória, ou simplesmente expandir o tamanho do heap. Nesse caso, inicie a execução com um parâmetro como (esse exemplo põe o heap em 200mb): javaw -Xmx200m -jar suaAplicacao.jar
Eu recomendo que você faça os dois.
B
bertu
thingol oque acontece que a conexao fica mto lenta, pq cada thread cria uma conexao para um determinado host! Se eu for esperar resposta de cada socket pra pular pro proximo host, pode ser que uma demore mais que outras, e ae a aplicacao ficara lenta. Por isso o uso de Threads!
o problema msm esta na hora que eu rodo ele com arquivo maior de 2mb, por ser mtas linhas axo q esta travando! Alguem tem uma ideia melhor de ser um arquivo txt em um loop ? preciso ir lendo a linha e jogano numa thread q faz a conexao
T
thingol
Estar estourando a memória do Java não não é problema do tamanho do arquivo-texto (isso dá quantas linhas? 10.000 linhas? 100.000 linhas? não sei o que vai no seu arquivo).
Pelo que estou achando, é questão da quantidade de objetos “new Repete” que estão vivos depois do processamento, ocupando memória desnecessária. Como você não postou a classe Repete não dá para saber o que ficou “vivo” lá que está ocupando memória.
T
thingol
Vou dar um exemplo do que costuma dar pau de excesso de memória consumida.
Um exemplo é você pegar uma conexão do banco de dados e não fechar corretamente todos objetos Resultset, Statement e Connection. Isso dá pau rapidinho se você não checar isso minuciosamente (ou seja, fechar isso no “finally” para forçar que tais objetos sejam corretamente fechados, mesmo se você tiver algum problema de execução do SQL).
B
bertu
certo. e tem algum metodo especifico para eu fechar por exemplo minha classe repete em determinado momento ? pq minha classe repete tem um socket que conecta no host, que vem daquele arquivo txt(400mil linhas) e dentro da classe repete, ele checa se esta on ou nao retornano o html.
B
bertu
entao teria como por exemplo na hora que chegar na linha 300 do arquivo.txt, aquele while ( linha = readline() != true) q checa linha por linha, desse um sleep ou tipo um pause, para q se faca determinada tarefa, e depois continua da onde parou ? tentei com for mais dae quando volta, ele comeca do 0
T
thingol
Que eu saiba não existe tal coisa.
O que você pode fazer é deixar tudo limpo (por exemplo, se sua classe Repete tem um vector ou arraylist nela, você pode limpar esse vector ou arraylist depois que ele foi usado.)