Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-01-2007, 16:52   #1
xplorer87
Senior Member
 
L'Avatar di xplorer87
 
Iscritto dal: Feb 2002
Messaggi: 392
[JAVA] java.lang.StackOverflowError

ciao ragazzi, mi sto cimentando con un pochettino di java e dopo un po' di mesi di inattivita' ho riaperto il buon eclipse... ma veniamo al dunque: sto scrivendo un programmino da runnare da console che opera su uno stack di oggetti, i quali ho definito io in un'apposita classe tramite una coppia (stringa, intero). ho quindi scritto una classe con un metodo che prende in ingresso una stringa in input, che ricorsivamente pusha/poppa elementi nello stack.

il codice di per se e' corretto, sia sintatticamente che semanticamente (ho verificato con successo per svariati input fino a una decina di caratteri), ma ottengo uno java.lang.StackOverflowError per input di dimensioni superiori, "come se" la jvm non ce la facesse ad eseguire tutta quella mole di calcoli (maledetta ricorsione!). c'e' un modo per ovviare a cio', magari runnando il mio codice "stand alone" (ma in java si puo'?), anziche' da dentro eclipse o facendo qualche altra cosa? ciao e grazie ^^
__________________
lol wut
xplorer87 è offline   Rispondi citando il messaggio o parte di esso
Old 24-01-2007, 22:27   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fai troppe ricorsioni, il problema è proprio lì...e vai a pienare lo stack...

Questa è l'opzione per controllare lo stack da riga di comando: http://www.caucho.com/resin-3.0/perf...xtp#stack-size

In alternativa cerca di ridurre il numero di ricorsioni...magari posta e ci proviamo...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 16:47   #3
xplorer87
Senior Member
 
L'Avatar di xplorer87
 
Iscritto dal: Feb 2002
Messaggi: 392
dunque andiamo per gradi: io provo a eseguire questo comando da console: java -Xss100m Main e ottengo nuovamente uno stack overflow, il che mi pare abbastanza impossibile se ho un input di 12 righe (e con 11, risposta istantanea senza problemi) e uno stack di 100 mega, come dovrei averlo settato. quindi probabilmente sbaglio qualcosa.

dal lato proprio algoritmico, proviamo a postare qualcosa e a commentare quello che diavolo ho combinato. il programma dovrebbe eseguire essere un parser universale per grammatiche di tipo 1. premettiamo un po' di oggetti che io ho definito ad-hoc:

Production, fatto di una coppia di stringhe (leftSide, rightSide)
Grammar, fatto di un vector di production (productionSet) e una stringa (startSymbol)
Ancestor, fatto di una coppia stringa (sententialForm) e intero (productionIndexUsedToUnfold)


poi ho definito un sententialFormStack, che e' uno Stack<Ancestor>, che e' lo stack delle sentential forms che devo controllare per verificare se una data stringa (stringToCheck) appartiene o no alla grammatica.

il metodo check prende in unput un int (scanIndex), che e' il puntatore al productionSet che mi dice da dove devo cominciare a trovare a trovare delle produzioni "buone" per unfoldare.
io faccio questo se lo stack e' vuoto cerco nel productionSet
una produzione del tipostartSymbol => sententialForm, where |sententialForm| <= |stringToCheck| (perche' sappiamo che le grammatiche di tipo uno "non si accorciano"). appena trovo una produzione "buona"
pusho nello stack l'Ancestor(startSymbol, i),
dove i ie' l'indice usato per unfoldare l'assioma della grammatica (cioe' startSymbol). poi parte una chiamata ricorsiva di check

se lo stack non e' vuoto, sono "in mezzo" al mio unfolding tree:
guardo l'elemento al top of the stack, e cerco nel productionSet delle parti sinistre (leftSide) che sono nella sententialForm corrente, cioe' quella dove sono arrivato unfoldando fino ad adesso. appena ne ho trovata una continuo ad unfoldare, controllando ogni volta se stringToCheck matcha la currentSententialForm e la pusho nello stack con l'indice della produzione che ho usato. se non riesco a trovare ulteriori produzioni per la currentStringToCheck, allora rimuovo l'elemento al top of the stack e continuo a parsare dall'indice dealla produzione che ho usato per andare nella vecchia sententialForm che ho eliminato. l'algoritmo funziona, da quello che ho potuto testare con stringhe da checkare di una decina di caratteri. il problema e' che con input piu' grossi incorro il 90% delle volte in stack overflow. ora ho qualche possibilita', apparte quella di cambiare completamente algoritmo?

Codice:
public boolean check(int scanIndex)
	{
		productionSet = givenGrammar.getProductionSet();
		startSymbol = givenGrammar.getStartSymbol();
		
		if(sententialFormStack.isEmpty())
		{
			
			for (i = scanIndex; i < productionSet.size(); i++)
			{
				currentLeftSide = productionSet.elementAt(i).getLeftSide();
				currentRightSide = productionSet.elementAt(i).getRightSide();				
				
				if (currentLeftSide.equals(startSymbol) && currentRightSide.length() <= stringToCheck.length())
				{
					if(currentLeftSide.equals(stringToCheck))
					{
						return true;
					}
				
					sententialFormStack.push(new Ancestor(startSymbol, i));
					return check(0);
				}
			}
	
			return false;
		}
 
			
		else
		{
			currentSententialForm = sententialFormStack.peek().getSententialForm();
			currentScanIndex = sententialFormStack.peek().getProductionIndexUsedToUnfold();
			
			
			for(i = scanIndex; i < productionSet.size(); i++)
			{
				currentLeftSide = productionSet.elementAt(i).getLeftSide();
				currentRightSide = productionSet.elementAt(i).getRightSide();
				
			
				totalLength = currentSententialForm.length() + currentRightSide.length() - currentLeftSide.length();
					
				if(currentSententialForm.contains(currentLeftSide) && totalLength <= stringToCheck.length())
				{
					newSententialForm = currentSententialForm.replaceFirst(currentLeftSide, currentRightSide);
					
					
					if(newSententialForm.equals(stringToCheck))
					{
						return true;
					}
					
					sententialFormStack.peek().setProductionIndexUsedToUnfold(i);
					sententialFormStack.push(new Ancestor(newSententialForm, -1));
					
					return check(0);
				}
			}
			
			
			if(currentSententialForm.equals(startSymbol))
			{
 
				return false;
			}
			
			sententialFormStack.removeElementAt(sententialFormStack.size()-1);
			currentScanIndex = sententialFormStack.peek().getProductionIndexUsedToUnfold();
			sententialFormStack.peek().setProductionIndexUsedToUnfold(-1);
 
			return check(currentScanIndex+1);
			
		}
	}
__________________
lol wut
xplorer87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 18:03   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Prova a stampare la profondità della ricorsione e verifica che non cambi con la modifica della dimensione dello stack (non metterla 100 mega, ma prova qualcosa come 2048K o 4096k)...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 20:37   #5
xplorer87
Senior Member
 
L'Avatar di xplorer87
 
Iscritto dal: Feb 2002
Messaggi: 392
mh, come faccio a "stampare la profondita' della ricorsione"? comunque con il comando java -Xss2048m Main oppure java -Xss4096m Main l'esito del programma non cambia (sempre stackoverflow per input grandi o risultato corretto per input piccoli).
__________________
lol wut
xplorer87 è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 20:44   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
k non mega... -Xss2048k

Per stampare la profondità della ricorsione basta fare questo:

public boolean check(int scanIndex, int depth)
{
//stampa depth
depth++; //poi lo passi nelle varie ricorsioni

Chiaramente la prima chiamata di check dovrà essere fatta con depth a 0...

Ultima modifica di cionci : 25-01-2007 alle 20:49.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 22:42   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Rispondo qua perchè a tenere gli occhi su due forum viene quello strabismo che se non sei Venere fa un po' impressione .

Dimmi che usi una versione di Java precedente all'attuale (6) su Windows XP.

Se così fosse allora potresti aver incontrato il bug 6316197: l'opzione -Xss non altera la dimensione predefinita dello stack per il Thread main.

Se così fosse allora dovresti poter risolvere cambiando il main da un ipotetico:

Codice:
public static void main(String[] args) {
   primoMetodo();
}
a

Codice:
public static void main(String[] args) {
    new Thread() {
        public void run() {
            primoMetodo();
        }
    }.start();
}
Comunque consiglio il passaggio alla versione iterativa.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2007, 13:29   #8
xplorer87
Senior Member
 
L'Avatar di xplorer87
 
Iscritto dal: Feb 2002
Messaggi: 392
dunque, grazie mille pgi, facendo come da te suggerito (infatti uso java 5 su xp, a proposito, la 6 come va?) sono riuscito ad aumentare lo stack a piacere e quindi ad evitare lo stack overflow. inoltre, sempre come da te suggerito, ho riscritto questa vista DFS (perche' e' questo in realta') secondo un algoritmo iterativo, che sebbene non abbia assolutamente problemi di stack overflow, e' un po' meno performante di quello ricorsivo, che e' comunque molto esoso in termini di memoria (stack).

altri consigli?
__________________
lol wut
xplorer87 è offline   Rispondi citando il messaggio o parte di esso
Old 26-01-2007, 13:45   #9
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Stando alla bug-parade il problema è stato risolto in Mustang. La sua JVM, tra l'altro, ha performance che mettono in serio imbarazzo le sue progenitrici. Puoi provare a vedere come se la cava col tuo codice.

Nel valutare le performance di un algoritmo del genere occorre andare coi piedi di piombo. C'è una soglia minima di invocazioni (predefinita in 1000 per la JVM client, 10.000 per quella server) necessaria prima che il compilatore HotSpot produca una versione in codice macchina dei metodi coinvolti. E' ben possibile che si noti un'apprezzabile differenza passando dall'uso di una stack "nativa", quale lo stack frame dei Thread, ad una Java, che è possibile tu abbia usato per la versione iterativa. Tale differenza, tuttavia, dovrebbe valere solo per i primissimi tentativi, dopo i quali dovresti notare un crollo verticale dei tempi di esecuzione.

Naturalmente sarò dragicamente smentito da un "ho provato due volte di seguito e fa schifo lo stesso"

P.s.: se puoi scrivi che hai trovato una soluzione anche nell'altro forum, così resta come documentazione ad uso di quanti incontrino problemi simili.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Il telescopio spaziale ESA Euclid ha fot...
L'astronauta ESA Sophie Adenot ha provat...
Leica SL3-P: la full frame più ev...
All'interno della capsula Starfall di Sp...
8BitDo Arcade Controller Pro è il...
Dead or Alive 6 Last Round: una chiusura...
DXC e Anthropic insieme per portare l'IA...
Lenovo presenta nuove soluzioni per l'IA...
OVHcloud potenzia la Quantum Platform: i...
Octopus Energy lancia Nook, la sua gamma...
IBM presenta il primo chip al mondo sott...
Qualcomm Dragonfly debutta nel settore d...
Scopa elettrica Proscenic P11 Ultra+ a 8...
Napoli capitale italiana del calcolo qua...
Emma avrebbe dovuto contribuire alla sov...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v