Java.lang.StackOverflowError: o que pode causar?

Fala amigos :slight_smile:

To com um bug aqui e preciso descobrir o motivo, mas está flórida pq não sei o que pode ocasionar este estouro na minha camada com o BD.

[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.shallowClone(Expression.java:3350)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3167)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3169)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.registerIn(Expression.java:3169)
[Nova entrada do log] 	    at oracle.toplink.expressions.Expression.copiedVersionFrom(Expression.java:811)
[Nova entrada do log] 	    at oracle.toplink.internal.expressions.CompoundExpression.postCopyIn(CompoundExpression.java:202)

Alguém pode me dar uma luz?

Obrigado

talvez uma recursão que não acabou, talvez um laço infinito… cadê o código? :smiley:

Ele não faz um laço infinito pq aqui no ambiente de desenvolvimento funciona, o problema é quando vai para o ambiente do cliente. Lá é bem lerdo as coisas, não sei se isso tem algo a ver :S

a stack é memória reservada aos programas, para operações de eventos de hardware. Se vc está recebendo esse tipo de erro(stack overflow), é o software que está consumindo memória demais.

tenta aumentar a memória nos arquivos de configuração :smiley:

Estranho que a recursão ocorre dentro do toplink.

Primeira coisa a tentar, vê se a versão do toplink é a mais atual.

tenta setar a memoria a ser utilizada: java -Xmx512m -jar arquivo.jar

[]'s

Geralmente stack overflow ocorre por causa de recursão infinita. Nesse caso aumentar a memória ja JVM não resolve muita coisa. Além de que eu acho que só é possível ajustar o tamanho do heap. O que pode ocasionar esse comportamento é alguma entrada que você não testou no ambiente de desenvolvimento mas que está no cliente.

nem sempre… ainda mais da forma como ele disse q sao as maquinas dos usuarios!!!

Aqui foi testada e a única execução desse processamento é uma query de select com parâmetros fixos, por isso foi testado aqui. A execução é a mesma. O problema lá é o ambiente, pra vc ter idéia, eu não consigo fazer deploy 2x sem antes matar a instância do OC4J.

É a pilha do windows que não suporta mais de 8 megas. Tem que rever o código. Alguma variável alocada na stack, tá muito grande. Esse é o grande problema de ter memória gerenciada automaticamente.

Que zuado…

Eu fiz uma alteração de processamento pq temos um fluxo, que pode retornar 40 mil registros e pra cada registro, estava sendo feita uma busca em outras tabelas. Mudei a query para realizar tudo de uma vez.

Vamos ver o que acontece e eu posto aqui

Valeu pela ajuda :smiley:

[quote=padcoe]Que zuado…

Eu fiz uma alteração de processamento pq temos um fluxo, que pode retornar 40 mil registros e pra cada registro, estava sendo feita uma busca em outras tabelas. Mudei a query para realizar tudo de uma vez.

Vamos ver o que acontece e eu posto aqui

Valeu pela ajuda :D[/quote]

Pois é, provavelmente vc esta executando uma query q retorna muita coisa, e vai tudo no ResultSet para a memória. Isto é muito mau! Vc tem que usar paginação! Não faz sentido uma query retornar mais que 1.000 registos, pois ninguem vai analisar mais do que 1.000 registos de uma vez, e mesmo assim é muito.

O que se deve fazer também é configurar na base de dados para limitar as queries para retornar no máximo 1000 registros.

Assim vc garante que nunca vai ter este probelma independente do tamanho das tabelas.

Ola,
sei que o tópico é antigo mas estou com o mesmo problema =(
Alguém poderia me ajudar a encontar o erro no meu código?
Meu código é o seguinte:

[code] public int achaMaior(int vetor[],int maior){
return maiorValorDoVetor(vetor,maior);
}

private int maiorValorDoVetor(int[] vetor,int maior)
{
	//vetor{3,4,2,6,7,8} 
	int meio=vetor.length/2;
	if(vetor.length-1==1)
	return vetor[0];
	
	if(vetor[meio]<maior)
		return maiorValorDoVetor(vetor, vetor[meio+1]);
	else 
		return maiorValorDoVetor(vetor, vetor[meio-1]);//da este erro nesta linha
	}

[/code]
Ah e o que eu estou tentando fazer é o seguinte:escrever uma função recursiva que determine o maior valor de um vetor usando o processo de bisseção, isto é, o vetor é dividido ao meio em dois subvetores e calcula-se o maior de cada um deles; o maior valor do vetor será o maior entre os dois valores apurados.

Obrigada pela ajuda

O valor da variável meio vai ser sempre igual em todas as interações da função recursiva. Então quando chega no if sempre vai ir a posição seguinte e a anterior referente ao meio, mas este meio nunca vai mudar, por que o vetor.length é constante.

Talvez o erro seja por que o calculo meio - 1 esteja dando menor que 0!

O melhor é vc rodar isto em debug e ver em cada interação qual o valor das variáveis ou jogar prints.

consegui resolver!!!
Obrigada pela ajuda :wink:
tinhas razão so mudei o valor da variavel meio e criei uma outra variavel para representar o final do vetor!