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 ?
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
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…
O projeto é desktop
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…
[quote=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…[/quote]
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.
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.
Por que é que você tem de pegar o banco todo e carregá-lo em memória?
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.
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.