CPU em 100%

Amigos tenho um problema com o seguinte trecho de codigo em minha aplicação. Em alguns pc´s, inclusive o que desenvolvi,
a aplicação não encontrou problemas mas em certos computadores apresenta comportamento estranho chegando a utilizar 100%
de CPU contra 10% nas maquinas que apresenta comportamento normal. Fiz uma comparação das maquinas todas
tem windows XP sp2 CPU acima de 2 GHZ pelo menos 512 de ram e jre 1.6. Fiz testes com este processo rodando sozinho, além dos normais do sistema.
O mesmo comportamento foi observado quando desenvolvido em java 1.5 e 1.6. Não sei mais o que fazer. Alguém imagina o que pode ser?

   while(condicao==true){
        try {                  
            byte[] buffer = null;
            BufferedImage imagem = geraImagem();
            image=redimensionar(image);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();                   
            ImageIO.write(imagem, "jpg", bos);
            buffer = bos.toByteArray();
            OutputStream out = s.getOutputStream();
            ObjectOutputStream outS = new ObjectOutputStream(out);
            outS.writeObject(buffer);
        } catch (Exception e) {
            
        }
    }
1 curtida

Já tentou desinstalar e resinstalar o JRE ou o sistema operacional das maquinas que tiveram problema ?
Ou tente atualizar o JRE.

Para computadores identicos terem desempenho drasticamente diferentes, o problema ou está no sistema operacional ( virus, malware) ou no hardware …

Os pc´s não possuem spy ou virus. o comportamento ocorre somente durante a execução do programa. Durante o restante do tempo a CPU fica quase 100% livre. Fiz avaliação com plugin profiler do netbeans este também mostrou
que somente nesse trecho ocorre estresse da CPU.

Se você consegue simular o problema, use um profiler.

O Netbeans vem com um embutido. Aí vc mede quem está ocupando o que e descobre quem é o método vilão.

O que não dá é para chutar…

Foi o que acabei de escrever. O trecho acima é o problema, mas só ocorre em alguns pc´s.

E qual dos métodos desse trecho ocupa 100%? O profiler é capaz de indicar isso também.

recentemente tive problemas semelhantes…

um JFileChooser tava ocupando 100 % da CPU.

deixei apenas o codigo que abre a tela dele, comentando o resto do metodo inteiro (inclusive a parte aonde chama outro metodo enviando o endereço do arquivo selecionado).

assim mesmo ocupava 100 %

atualizei o avast e dei o scan e novidade…ele encontro um virus generico…

pesquisando sobre o dito cujo descobri que o melhor a fazer é manda ele da um scan no boot, e assim eu fiz… quando abri a aplicação denovo depois de reseta tava normal…

a) Sua máquina tem 512 MB - ainda acho pouco
b) Você abre mas não fecha os OutputStreams? Precisa fechar tudo direitinho. Senão gasta memória adoidado. Principalmente o ObjectOutputStream, que tem a tendência de consumir memória se você não o fechar.

[code]
while(condicao==true){
try {
byte[] buffer = null;
BufferedImage imagem = geraImagem();
image=redimensionar(image);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(imagem, “jpg”, bos);
buffer = bos.toByteArray();
OutputStream out = s.getOutputStream();
ObjectOutputStream outS = new ObjectOutputStream(out);//Enquanto for verdadeiro você continua criando varias instancias de ObjectOutputStream e deixando-os aberto?
outS.writeObject(buffer);
} catch (Exception e) {

}
}[/code]

Se esse for o problema, acho que algo assim resolveria

ObjectOutputStream outS = null;
ByteArrayOutputStream bos = null;
try{
outS = new ObjectOutputStream(s.getOutputStream());
bos = ByteArrayOutputStream();
}catch(Exception e){
e.printStackTrace();
}
while(condicao){
try {
byte[] buffer = null;
BufferedImage imagem = geraImagem();
image=redimensionar(image);
ImageIO.write(imagem, "jpg", bos);
buffer = bos.toByteArray();
outS.writeObject(buffer);
} catch (Exception e) {
e.printStackTrace();
}finally{
bos.close();
outS.close();
}
} 

eu vi isso uma semanas atrás, o OWB, uma aplicação da Oracle para DataWareHouse tem uma ferramenta de backup, que em UM desses backups chegou a consumir fácil fácil 100% de memória numa máquina de 2 gb… Acreditam??? Se alguém souber explicar, agradeco… hehehe Bug??? hhhhhmmmmm

Memória não é meu problema e sim CPU.

Não pode afirmar isso até ver se realmente você não está com falta de memória.
Que eu saiba, programas Java sofrem cronicamente de falta de memória.
Quando um programa Java está usando toda a memória alocada para ele (se você não está usando a opção -Xmx na linha de comando fica pior ainda) ele começa a fazer duas coisas:

  • Fica fazendo “garbage collection” direto (isso leva a CPU para cima)
  • Fica fazendo um monte de swap em disco, e isso também leva a CPU lá para cima (além de você ver que a luzinha do HD fica acesa direto).