Memória e String [Resolvido]

17 respostas
felixcomputer

Pessoal, tenho duas perguntas, gostaria de saber se existe alguma forma de eu ver quanto de memória os meus objetos estão alocando em uma aplicação, é possível?

A segunda é sobre String, fiquei sabendo que ela é uma classe final, ou seja, eu só posso atribuir um valor pra ela apenas uma vez, certo? No caso, se eu atribuir duas vezes, ele apenas cria uma novo objeto e muda a referencia, mas eu gostaria de desalocar um objeto meu, no caso eu pensei em fazer isso

String um = "um";
um = null;

Eu queria fazer isso para depois chamar o garbage collector e então retira-la da memória, contudo levando em consideração aquilo que eu falei no começo sobre só poder atribuir uma vez, no caso se eu fizer isso, ele vai desalocar quando o gc() for chamado ou ele apenas vai mudar a referencia para nulo e o objeto String continuar existindo?
Obrigado :roll:

17 Respostas

maquiavelbona

felixcomputer:
Pessoal, tenho duas perguntas, gostaria de saber se existe alguma forma de eu ver quanto de memória os meus objetos estão alocando em uma aplicação, é possível?

A segunda é sobre String, fiquei sabendo que ela é uma classe final, ou seja, eu só posso atribuir um valor pra ela apenas uma vez, certo? No caso, se eu atribuir duas vezes, ele apenas cria uma novo objeto e muda a referencia, mas eu gostaria de desalocar um objeto meu, no caso eu pensei em fazer isso

String um = "um";
um = null;

Eu queria fazer isso para depois chamar o garbage collector e então retira-la da memória, contudo levando em consideração aquilo que eu falei no começo sobre só poder atribuir uma vez, no caso se eu fizer isso, ele vai desalocar quando o gc() for chamado ou ele apenas vai mudar a referencia para nulo e o objeto String continuar existindo?
Obrigado :roll:

Sobre o tamanho do objeto:
http://www.guj.com.br/posts/list/49567.java

,lembrando que chamar o gc não garante que vá executá-lo.

Sobre o que o Garbage Collector faz:
http://www.guj.com.br/java.tutorial.artigo.28.1.guj
http://www.javafree.org/javabb/viewtopic.jbb?t=1386

Até!

cassio

felixcomputer:
Pessoal, tenho duas perguntas, gostaria de saber se existe alguma forma de eu ver quanto de memória os meus objetos estão alocando em uma aplicação, é possível?

A segunda é sobre String, fiquei sabendo que ela é uma classe final, ou seja, eu só posso atribuir um valor pra ela apenas uma vez, certo? No caso, se eu atribuir duas vezes, ele apenas cria uma novo objeto e muda a referencia, mas eu gostaria de desalocar um objeto meu, no caso eu pensei em fazer isso

String um = "um";
um = null;

Eu queria fazer isso para depois chamar o garbage collector e então retira-la da memória, contudo levando em consideração aquilo que eu falei no começo sobre só poder atribuir uma vez, no caso se eu fizer isso, ele vai desalocar quando o gc() for chamado ou ele apenas vai mudar a referencia para nulo e o objeto String continuar existindo?
Obrigado :roll:

A classe String é imutável, isso é, todos os seus métodos retornam ma nova String, sendo que a original permanece inalterada. Isso vale também para quando temos, por exemplo:

String s = "blablabla";
s = "blebleble";

No momento em que redefinimos s para “blebleble”, estamos criando uma nova String e associando uma cópia da referência para este novo objeto para s. O antigo objeto, que contém “blablabla” ainda está na memória, mas não há mais ninguém fazendo referência a ele. Assim, ele logo será coletado pelo GC.

Se vc faz como disse:

String um = "um";
 um = null;

Quando faz um = null está tornando um elegível para garbage collection, porém não há garantia alguma de que ele será coletado neste momento, pode levar um tempo. Chamar System.gc() também não garante que a coleta de memória não utilizada ocorrerá instantâneamente, mas pode até ajudar…

Abraço!

LPJava

mais quando voce chamar o coletor de lixo nada de garante q ele venha ser executado… ele pode ou nao executar… se ele tiver afim… entao vai ser garantido q ele venha tirar da memoria objetos perdidos…
no seu exemplo ai quando vc adiciona null ao objeto name, a anterior é perdido mais ta la na memoria esperando o coletor tirar.

public class Sting
{
	public static void main(String args[]){
		String name = "Camilo";
		name = null;
		
		System.out.println(name);
	}
}

veja a saida desse pequeno programa.
Espero ter ajudado!!

Sami_Koivu

Sobre atribuir null, vale a pena ler o artigo do Paulo Silveira no blog da Caelum:

http://blog.caelum.com.br/2007/01/03/atribuindo-null/

[]s,
Sami

G

felixcomputer:
Pessoal, tenho duas perguntas, gostaria de saber se existe alguma forma de eu ver quanto de memória os meus objetos estão alocando em uma aplicação, é possível?

A segunda é sobre String, fiquei sabendo que ela é uma classe final, ou seja, eu só posso atribuir um valor pra ela apenas uma vez, certo? No caso, se eu atribuir duas vezes, ele apenas cria uma novo objeto e muda a referencia, mas eu gostaria de desalocar um objeto meu, no caso eu pensei em fazer isso

String um = "um";
um = null;

Eu queria fazer isso para depois chamar o garbage collector e então retira-la da memória, contudo levando em consideração aquilo que eu falei no começo sobre só poder atribuir uma vez, no caso se eu fizer isso, ele vai desalocar quando o gc() for chamado ou ele apenas vai mudar a referencia para nulo e o objeto String continuar existindo?
Obrigado :roll:

Quando você atribui null para a variável um, a String “um” não ficará elegível para o gc, mesmo que não exista mais nenhuma referência à ela. Quando se trata de Strings, as coisas funcionam um pouco diferente: o literal “um” irá para um “Pool de Strings” para poder ser reaproveitado, de forma que sempre que você criar novamente uma String com o valor “um”, não será criado um novo objeto, mas sim uma referência para a String já existente no pool.
Portanto, respondendo à sua segunda pergunta, no caso de Strings, a String continuará a existir na memória.

J

Lembrando que uma classe final, não quer dizer que você não possa alterar o objeto e sim, que ela não pode ser estendida. O que faz a String imutável é simplesmente a ausência de métodos de alteração da String.

felixcomputer

Primeiramente, obrigado a todos, eu fiz essa pergunta pq estou fazendo parser de paginas html e “jogando” uma quantidade absurda de Strings para o banco. Só que em determinados projetos grandes cujo parser eu estou fazendo, acaba lançando a exceção java heap space por falta de memória, agora, eu gostaria de saber como desalocar o máximo de memória possível, entendi pelo artigo do Paulo Silveira que mudando de escopo pode ser uma grande saída, mas eu pergunto, mudando de escopo as meus objetos não referenciados “morrem” literalmente como a gente aprende na universidade, ou eles ficam lá na memória esperando a boa (ou má) vontade do Garbage Collector? Quanto a atribuição do null para marcação do garbage, eu aprendi isso no Deitel, hehehe. Se alguém tiver uma idéia de como eu posso “limpar” minha memória eu agradeço, vou ler todos os artigos que vcs indicaram
obrigado mesmo, :smiley:

Samuel Félix

fabim

para deslocar o maximo de memoria possivel

-Xms128m
-Xmx256m

felixcomputer

Sim sim, eu to rodando o eclipse com esse parâmetro, contudo o problema não está em alocar mais memória, e sim desalocar, de preferência aquilo que eu ja coloquei no banco. Me deram uma idéia de usar o StringBuffer ao invés de String, vou analisar se é viável mesmo. Toda ajuda é bem vinda, obrigado fabiocsi,

Samuel Félix

J

Não há nenhuma forma de você “limpar” a memória, você terá que ficar a mercê da boa vontade do GC de qualquer jeito…

Talvez um simples ajuste nos parâmetros da JVM já ajudem a resolver o problema de falta de memoria, pois, talvez sua aplicação esteja realmente consumindo toda a memória da JVM (não do computador), e ajustando os parametros isso já seria resolvido…

Veja os parametros -Xms e -Xmx.

Se você está trabalhando com uma quantidade grande de String’s e se, principalmente, você está fazendo muitas concatenações, considere o uso de StringBuilder, ou StringBuffer se estiver trabalhando em um contexto multithread.

fabim

felixcomputer:
Sim sim, eu to rodando o eclipse com esse parâmetro, contudo o problema não está em alocar mais memória, e sim desalocar, de preferência aquilo que eu ja coloquei no banco. Me deram uma idéia de usar o StringBuffer ao invés de String, vou analisar se é viável mesmo. Toda ajuda é bem vinda, obrigado fabiocsi,

Samuel Félix

usar Stringbuffer e realmente MUITO melhor…

agora, qto ao heap space… continua a acontecer, mesmo vc tendo passado os argumentos ?

fabim

te perguntei isso pelo seguinte:

eu tava com esse problema qdo trazia uma imagem de 60Mb, pois precisava ser em 500 dpis, direto do scanner (ainda vo postar um artigo aqui de como obter imagem de scanner, pq foi um SACO fazer essa ponte de JNI com C++)…

ai fui no eclipse, e setei esses argumentos no RUN… mas ai nao funciona… vc precisar ir em Window - Preferences - Java - INstalled JREs - e ai sim pasar esses argumentos no campo “Default VM arguments”…

ai acabou o problema de heap space xD

felixcomputer

Não não, as vezes, as vezes eu extraio informações de umas 200 paginas web, as vezes 400…dependendo do projeto que eu analiso, agora, em projetos muito grandes, eu não tenho como evitar o java heap space, contudo, quero enxugar ao máximo o código da minha aplicação,

Quanto a imagem do Scanner vai ser muito bem vindo!

Samuel Félix

LPJava

mais se usar o StringBuilder ao inves da class String nao melhoria a questao de memoria? de ter objetos perdidos? depois que conheci a StringBuilder quase nao uso a String.

felixcomputer

Esse é o meu próximo passo, vou procurar sobre o StringBuilder e o StringBuffer, mas eu dei uma olhada rápida no fonte do StringBuilder e percebi que ele também é final, no caso, eu não vou recair no mesmo problema dos objetos perdidos?

Samuel Félix

cv1

Samuel, pega o JProfiler e da uma brincada com ele. Garanto que vc vai aprender um bocado com o que vc vai ver ali.

LPJava

vc vai ver a essencia do StringBuilder!! depois vc posta aqui… e vera pq nao cai como a class String.

Criado 15 de janeiro de 2007
Ultima resposta 15 de jan. de 2007
Respostas 17
Participantes 9