Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-01-2007, 17: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, 23: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, 17: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, 19: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, 21: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, 21: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 21:49.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 25-01-2007, 23: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, 14: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, 14: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


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
Sembra ormai certo: la prossima Xbox sar...
“Solutions Beyond Displays”: la strategi...
La società europea The Exploratio...
Dalle auto ai robot umanoidi: Faraday Fu...
Vodafone annuncia la dismissione di un s...
Stiga lancia i nuovi robot tagliaerba co...
Bullismo e cyberbullismo, Keenetic lanci...
Con AI Skills Checker Bitdefender mette ...
E-bike giapponese con 1.000 km di autono...
Un eVTOL con cui basta saper andare in b...
Dal mercato cinese al mondo: HONOR firma...
Sovranità digitale: l'UE sperimen...
Accesso alla memoria su Windows 11 solo ...
iPhone 18 Pro Max con batteria da oltre ...
Windows 11, cali di prestazioni sulle GP...
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: 01:37.


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