Problema com o Garbage collector

9 respostas
abraaoinfo

Imagina uma migração de base, que vc precisa pegar e gerar Strings de inserts e fazer alguns tratamentos de dados… em teoria vc pode ter um método que contenha SELECTS pra extrair dados, outro para TRATAMENTO e outro para INSERÇÂO… se vc tem uma base com 10 milhões de registros o garbage collector abre as pernas. Ele não consegue limpar essas Strings todas ai a unica solução é aumentar a memoria da vm ?

9 Respostas

J

Aguenta sim.

O que pode não aguentar é a RAM do pc. Então você faz páginas para que isso não aconteça.


http://download.oracle.com/javase/6/docs/api/java/nio/channels/FileChannel.html

Lucas_Abbatepaolo

Cara da uma olhada como funciona o objeto String em JAVA.
Ele é imutavel e se vc nao tomar cuidado vc pode ter problemas com isso sim…

Depende muita da forma q vc fez…

Tente usar um StringBuilder…

abraaoinfo

O projeto é desktop

FernandoFranzini

Para começo de conversar seu titulo esta totalmente equivocado!!!
O GC não é um problema…o GC é uma super ajuda!!!
GC automatiza a limpeza de objetos sem referencia no HEAP…se seu programa gasta o HEAP inteiro e não libera os objetos…tenho certeza absoluta que o problema não é o GC é sim o programador autor da “façanha” kkkkkk
Para subir 10 milhões de registros no heap é só vc ter RAM suficiente e corretamente configurada para o JVM…
Caso vc não tenha maquina para isso…vc pode otimizar o processo na tentativa de economizar objetos
*) Não use ORM
*) Reuse os mesmos objetos
*) Use StringBuffer
*) Faça paginação de registro de acordo com sua RAM disponivel para JVM
etc…

J

Lucas Abbatepaolo:
Cara da uma olhada como funciona o objeto String em JAVA.
Ele é imutavel e se vc nao tomar cuidado vc pode ter problemas com isso sim…

Depende muita da forma q vc fez…

Tente usar um StringBuilder…


No que uma string sendo imutável influencia em consumo de memória?

se eu fizer

string s = "wewqeqweqwqwqwqweqwewq"; s = null;

o endereço de memória de s já está marcado para ser coletado.

para trabalhar com grande quantidade de registros é preciso paginar memória corretamente e não carregá-los todos para RAM.

Aliás, até seu sistema operacional faz isso no sistema de arquivos.

Lucas_Abbatepaolo

Assumindo que ele esta fazendo isso…

string s = "wewqeqweqwqwqwqweqwewq";   
s = null;

com certeza ele não tera problemas, pois assim o objeto ja estaria liberado para a coleta

POREM

se ele usar (supondo que x seja um valor alto)

string s  = "";
for(int i = 0; i < x; i++){
  string s += "wewqeqweqwqwqwqweqwewq";   
}

com certeza em algum momento ele terá problemas. Não que o sistema dele ira dar pau, mais com certeza ira causar um trabalho grande para o garbage, o q so deixaria o sistema mais lento.

E

Por que é que você tem de pegar o banco todo e carregá-lo em memória?

ViniGodoy

Não. Ele consegue limpar quantas Strings você fornecer para ele.
Mas você tem que ter certeza de que as Strings não estão mais sendo referenciadas.

Se ele está abrindo as pernas, é pq tem bug no seu código. Use o profiler do Netbeans para identificar onde.

E

Uma coisa bizarra que já me quebrou as pernas uma vez foi o método String.substring(). Como vocês devem saber, String.substring() cria uma nova String (OK) mas essa nova string, em vez de referenciar um novo char[] criado a partir dos elementos que ele pegou da String, referencia o char[] original da String original. Se a String original for muito grande, então você pode ter o caso de ter uma String pequena ocupando muito espaço, justamente porque a String original é que era grande.

Criado 8 de setembro de 2011
Ultima resposta 9 de set. de 2011
Respostas 9
Participantes 6