Java cupando 100% da CPU

Boa tarde, eu percebi que todas as vezes que eu tenho que trabalhar com arquivos textos tanto na leitura quanto na escrita o meu processo ocupa totalmente a cpu. Ja testei com FileWriter e com OutputStreamWriter e o resultado é o mesmo. Alguem tem uma solução para isso?

Um computador melhor! :B

hehehehe!

não sei msm nunca tinha notado!

Ta certo que meu pc não é lá de ultima geração, mas coloco muitos jogos rasuaveis que não pesam a metade que esse processo está ocupando. É um Pentium 4. 3ghz.

Você lê vários arquivos pequenos ou apenas alguns grandes?

Geralmente esse comportamento (alto uso de CPU) ocorre ao ler vários arquivos pequenos, pois o consumo é alto para localizar em que setor está o arquivo no sistema de arquivos (em caso de sistemas que se fragmentam o problema geralmente é maior), para disponibilizá-los para seu programa e depois para liberar os recursos disponíveis.

Se essas operações acontecem em um período muito curto (ou seja, os arquivos são lidos rapidamente, portanto pequenos) o consumo geralmente é alto.

To de arriação mano, nem skenta, mas tipo eu nem sabia q salvar o arquivo dava isso :?

Vlw pela curiosidade! :smiley:

O exemplo claro disso é que quando você acessa as propriedades de uma pasta grande o consumo de CPU é alto por alguns instantes.

Isso ocorre durante a contagem de arquivos e o tamanho deles. O conteúdo não é lido, mas o processo de localizar e contabilizar muitos arquivos leva ao alto uso do processador.

talvez um thread pode ajudar um pouco

Normalmente eu leio de uma tabela em algum banco de dados ou de outro txt, ai vou salvando em uma variavel e depois mando gravar em um txt. Normalmente demora uns 5 a 10 minutos com a cpu a 100%.

Se for só leitura e escrita de arquivos, esse comportamento não é normal. Deve ter alguma coisa na tua arquitetura que tá errada, ou que faz muita coisa mesmo.

Ou talvez algum antivirus que esteja atrapalhando o processo.

Nesse caso de gravar em apenas um arquivo realmente não é normal. Além disso, 10 minutos com um P4 em 100% é muita coisa…

Se esse seu arquivo for gigante, realmente, processa-lo pode ser uma tarefa exclusivamente do processador e sua CPU ir facilmente a 100%. Mas esse não deve ser o seu caso.

Um primeiro passo é usar um profiler, e ver exatamente que ponto do seu código está consumindo tanto CPU. Provavelmente é algum erro de lógica. Sugiro que use o Visual VM, que já acompanha o próprio Java:
https://visualvm.dev.java.net/

O mais engraçado é que um sleepTime de 0 num wait faz o Java esperar para sempre. Eu achei a escolha do valor péssima, por mim, tinha que ser -1 e o 0 continuar significando “nada”.

Uma vez, por erro de código, ocorreu o mesmo problema:

while(verificaCondicao()) { Thread.sleep(sleepTime); }

Só que a variavel sleepTime estava com valor 0 (era lido de um arquivo properties e alguém zerou o valor).
O consumo da CPU subiu muito pois era uma condição muito “atômica” (o verificaCondicao lia uma “variável booleana estática” que era alterada por outra thread que corria em paralelo, por exemplo).

Loops muito atômicos tendem a fazer isso com a CPU (especialmente se for núcleo único).

Concordo. Tosco isso. Mas ainda tem como notificar e fazer a thread continuar. Já no caso do sleep…