j2me - heap

3 respostas
M
Pessoal to fazendo um jogo onde tenho um cliente e um servidor.Fui verificar o consumo de memória pelo emulador e ai blz, o cliente, que não faz muitas operações e verificações, está com +- 47000 bytes, +-800 objetos e nesse ponto o gc executa e fica por ai. o servidor, que é quem faz praticamente todo o trabalho ta um absurdo, enquanto tem espaço no heap ele vai colocando coisa, coloquei 500kb de heap e ele usou tudo, e foi a quase 20 mil objetos, totalmente sem noção. Um dos pontos que está com um consumo grande é nos métodos abaixo, eles são praticamente acionados a cada interação do loop do jogo.
public String readDataClient() {
    	byte[] data = new byte[512];
    	try {
    		int len = con.receive(data);
    		String msg = new String(data, 0, len);
    		return msg;
    	}
    	catch (Exception e)
    	{ System.out.println("readData(): " + e);
    	return null;
    	}
    } // end of readData()
    
    public String[] readDataServer() {
    	byte[] data = new byte[512];
    	try {
    		int len = con.receive(data);
    		String msg = new String(data, 0, len);
    		String[] msgReturn= split(msg,"|"); 
    		return msgReturn;
    	}
    	catch (Exception e)
    	{ System.out.println("readData(): " + e);
    	return null;
    	}
    } // end of readData()
    
    public boolean sendMessage(String msg){
    	byte[] msgBytes = msg.getBytes();
    	if (msgBytes.length > 512) {
    		System.out.println("Message too long, sending \"??\" instead");
    		msgBytes = "??".getBytes();
    	}
    	try {
    		con.send(msgBytes);
    		return true;
    	}
    	catch (Exception e)
    	{ System.out.println("sendMessage(): " + e);
    	return false;
    	}
    } // end of sendMessage()
Como que eu posso fazer pra diminuir a quantidade de objetos criados? Tentei forcar a chamada do gc mas não adianta, e nem sei se daria muito certo porque ia perder desempenho que é algo que o jogo precisa. Quando eu chamo o gc pelo monitor do wtk ele cai a praticamente a mesma quantidade de memoria e objetos sendo usados do cliente. :???:

3 Respostas

C

Chame o GC e de um pequeno sleep. (Dando assim chance para que o GC atue!)

M

Valeu Clovis, vou dar uma limpada no código e fazer isso que você disse!

Obrigado!

J

Passo pela mesma situação…

Depois de quebrar a cabeça com a aplicação em um Nokia 6100, suspeitei que o problema seja alocação de recursos na transmissão. Meu problema é o seguinte, se chamo até 2x a conexão à internet ocorre de boa…mas a 3a raramente e nunca passa daí. No emulador, limitei a memória para algo parecido com o aparelho… 64Kb…e para minha surpresa recebia um OutOfMemory exception no mesmo ponto, ao chamar a classe de transmissão…

Já fiz de tudo, passei para static reduzi variáveis, reutilizei componentes, e mesmo com 40k de memória livre, recebo o OutOfMemory no mesmo ponto… :roll:

Uma solução que pensei seria quebrar a aplicação em vários MidLets, mas isso quebraria a seqüência lógica do programa…se for o ultimo caso terei q fazer…

alguma dica?
estou usando para conexão o Connector aliao ao InputStreamReader…

Criado 24 de agosto de 2006
Ultima resposta 25 de ago. de 2006
Respostas 3
Participantes 3