Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67

    Eliminare oggetti istanziati: efficienza di un programma

    Salve a tutti. Ho un piccolo problema.
    Sto provando a creare un piccolo gestionale in java tanto per fare un po di esercizio. Ci tengo molto all'efficienza di tutto quello che faccio pertanto vorrei che utilizzasse meno ram possibile.

    Il programma prevede un frame con all'interno un pannello contenente alcuni bottoni al click dei quali viene richiamato un ascoltatore di eventi del bottone che mi istanzia un nuovo oggetto(presente in altre classi).

    Questo nuovo oggetto sarebbe un qualcosa che mi crea un pannello per l'inserimento di alcuni dati che salverò in un DB (che ovviamente lo sovrappongo a quello esistente con un gioco di setVisible()...se esistono metodi più efficienti fatemelo sapere per favore)

    Il pannello è composto da una serie di campi ed in basso ho un altro pannellino che ha i classici bottoni SALVA, RIPRISTINA CAMPI, HOME.

    quando clicco sul bottone della homepage per andare ad esempio nel pannello INSERISCI CLIENTE, vorrei che tutto ciò che ho istanziato precedentemente per la homepage mi venga cancellato, questo perchè quando vado a far click sul bottone HOME del pannello INSERISCI CLIENTE io devo tornare indietro, pertanto allocherei memoria per un nuovo oggetto HOMEPAGE (e quindi ho gia 2 oggetti homepage creati ed un oggetto INSERISCI CLIENTE che vorrei anche eliminare)

    Fatto questo giochetto diverse volte mi troverei un casino di oggetti homepage ed inserisci clienti allocati che non utilizzo e quindi ho un forte spreco di memoria.

    Come posso risolvere questo problema?

    La struttura che utilizzo è la seguente:

    Classe che crea il frame.

    Questa classe crea un oggetto di tipo : HomePage hp = new HomePage(framePrincipale);
    che contiene il pannello con i vari bottoni per la selezione dell'azione da fare.

    La classe HomePage ha degli ascoltatori dei bottoni di questo tipo :

    codice:
    class bottoneNuovoClienteListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                pannelloContenitore.setVisible(false);
                InserisciNuovoCliente inc = new InserisciNuovoCliente(framePrincipale);
                framePrincipale.validate();
            }
        }
    Quando creo questo oggetto INSERISCINUOVOPAZIENTE ho il pannello in basso con il bottone home con un ascoltatore di questo tipo che mi ricrea un oggetto di tipo homepage

    Voglio evitare questo spreco inutile di memoria cancellando di volta in volta nel bottone l'oggetto corrente.

    Come faccio???Si può fare?

    Mi scuso per la lunghezza del post ed auguro buon anno a tutti!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    della cancellazione degli oggetti non riferiti si occupa il garbage collector, il quale ha una sua politica di gestione che non sto qui a scriverti...ti basta sapere che non sai quando e se viene chiamato.
    In java non esiste nemmeno qualcosa come il distruttore C++ (che per te sarebbe perfetto).

    Il problema lo risolvi in tanti modi differenti:
    1. creare una finestra che racchiuda tutto quindi alla pressione del bottone abiliti alcune aree
    2. avere degli oggetti che rappresentano il tuo INSERISCI_CLIENTE, che istanzi all'avvio, ma che ti tocca resettare ad ogni pressione del bottone inserisci cliente
    3. rimanere come ora.

    Ora la soluzione che potrebbe giovarti è la due, ma devi tenere conto di diversi fattori:

    1. con quale frequenza pensi di effettuare le operazioni? Se vuoi l'efficienza, conta ad esempio crearti la nuova finestra ti costa 100, crearne una all'avvio, mantenerla, resettarla ogni volta che premi il pulsante ti costa ad esempio 1000 inizialmente e 20 ad ogni reset. A fronte di 100 inserimenti giornalieri, il primo metodo ti fa spendere 10000, il secondo 3000, vedi bene che è conveniente il secondo. Al contrario, facendo pochi accessi (metti 5) allora nel primo caso spendi 500, nel secondo caso 1100 e vedi bene che il primo metodo fa comodo.

    Come vedi questa è una prima osservazione che puoi fare per ogni operazione, ripetila per tutte e fai bene i tuoi conti.
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    grazie valia per la risposta. In effetti vengo da linguaggi C-Like ed ho cominciato il java da praticamente un paio di settimane. Non sapevo affatto questa cosa del Garbage Collector ma mi informerò sicuramente.

    Restare come ora non sarebbe quindi una soluzione errata mi sembra di capire...

    D'altra parte io avrei diversi tipi di bottoni che sicuramente verranno cliccati con differente frequenza, ad esempio l'inserisci nuovo cliente penso che sarà cliccato molto meno di un bottone che ti permette di lavorare con clienti già esistenti. Dovrei quindi adottare una politica diversa per ogni bottone penso.

    Sei stato molto esaustivo nella spiegazione specialmente nel calcolo dei pesi anche se non ho comunque capito da dove prendi questa fonte di "differenza" tra instanziare nuovi oggetti e refresh di altri. anzicchè 1000 per l'instaziamento di nuovi oggetti e 20 per il refresh non potrebbero essere ad esempio 10 l'istanziamento e 5 il refresh? non mi è chiaro come fai ad attribuire questi "pesi ideali".

    Ma dato che sei sicuramente più esperto di me ti vorrei chiedere di dare un piccolo commento in termini di pesi ed efficienza alla soluzione che ho adottato io dato che non l'hai detta nel precedente messaggio.
    inoltre, dato che non so ogni quanto passa il G.C. come faccio ad essere sicuro che l'oggetto che ho instanziato inutilmente ad esempio per via di un errore perchè prima clicco in un bottone, poi me ne pento e torno alla homepage per cliccarne un altro, come faccio a capire se questo oggetto viene effettivamenet eliminato o mi sta li ad intasare la ram?

    Grazie mille per l'attenzione!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    mi fa piacere esserti stata utile.
    I numeri che ti ho dato sono un esempio (non sono affatto reali) per farti capire il ragionamento che spesso c'è dietro a queste scelte.
    Sono tutte scelte implementative che fanno riferimento cmq ad aspetti noti allo sviluppatore perché è anche l'analista del progetto e/o perché l'analista indica queste informazioni.
    Sono una linea guida per capirci.
    Non so dare un peso alle tue operazioni proprio perché non conosco per intero il tuo progetto, ne conosco una parte e per quanto ne so le due soluzioni sono al momento uguali (anche se io preferisco evitare di tenere variabili globali, ma è un'opinione personale come vedi).

    Guarda bene il garbage collector, tu non sai quando e se viene chiamato e in realtà non sai nemmeno se nel momento in cui lo chiami il tuo oggetto viene effettivamente cestinato. Probabile che se tu clicchi 10 volte hai 10 oggetti e/o riusi uno che già hai, questa è la politica del GC che non conosco a fondo (quindi non saprei aiutarti).

    per chi viene da una programmazione C-like è dura non doversi occupare della liberazione delle aree di memoria, ma in java usi e te ne freghi (in un certo senso).
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    Beh grazie mille, mi sei stata utilissima. A quanto pare java è un ottimo alleato di chi produce RAM!!!
    mi sembra quindi capire che java non è un linguaggio "serio" sotto certi termini...anche se devo ammettere che mi sembra davvero immenso, infinito, ricco di qualsiasi cosa si possa aver bisogno soprattutto per quel che riguarda l'aspetto grafico. Di questo proprio non ci si può lamentare

    In realtà il programmino che vorrei fare e che sto provando a fare sembra banale ma ha tante piccole sfaccettature che starei troppo tempo per parlartene se però vuoi possiamo sentirci privatamente per discuterne un po.
    Intanto ti ringrazio comunque per l'aiuto che mi hai fornito e per le pulci in testa che mi hai levato...Ora che so che il GC è probabilmente come l'AMIA di palermo o il servizio di nettezza urbana campano potrò dormire sogni tranquilli ed essere felice che la ram si svuota sicuramente nonappena spengo il pc!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da dinoala
    Beh grazie mille, mi sei stata utilissima. A quanto pare java è un ottimo alleato di chi produce RAM!!!
    mi sembra quindi capire che java non è un linguaggio "serio" sotto certi termini...anche se devo ammettere che mi sembra davvero immenso, infinito, ricco di qualsiasi cosa si possa aver bisogno soprattutto per quel che riguarda l'aspetto grafico. Di questo proprio non ci si può lamentare
    dipende tu che intendi per serio. Non ho mai visto il sistema andare in palla per via di un pannello in più, al contrario va in palla se dentro cicli istanzi stringhe su stringhe (un esempio), ma in quelle condizioni nemmeno altri linguaggi si comportano tanto bene (prova a fare in un ciclo continue allocazioni e di deallocare tutto una volta finito il ciclo).
    Il fatto di non occuparti direttamente della distruzione degli oggetti risiede nell'avere la virtual machine che lo fa per te, nel pensare e strutturare tutto il sistema di esecuzione di un programma in modo diverso rispetto a quanto non si faceva in C.
    Tieni conto che java deriva direttamente dal C++ (per me ha tolto i lati negativi del C++) e C# esegue in ambiente managed (quindi senza diretta gestione della memoria).
    Se per te è di vitale importanza deallocare ogni singola variabile che istanzi, allora non va bene nessun linguaggio managed, perché ci sarà sempre qualcuno che lo farà al posto dello sviluppatore.
    L'ideale in questo caso è l'uso di un linguaggio ad oggetti come C++, con ovviamente tutti i pro e i contro dello stesso.


    Originariamente inviato da dinoala
    In realtà il programmino che vorrei fare e che sto provando a fare sembra banale ma ha tante piccole sfaccettature che starei troppo tempo per parlartene se però vuoi possiamo sentirci privatamente per discuterne un po.

    Intanto ti ringrazio comunque per l'aiuto che mi hai fornito e per le pulci in testa che mi hai levato...Ora che so che il GC è probabilmente come l'AMIA di palermo o il servizio di nettezza urbana campano potrò dormire sogni tranquilli ed essere felice che la ram si svuota sicuramente nonappena spengo il pc!!!
    quando vuoi, però il consiglio prima di proseguire:
    1. dimentica la logica C per la programmazione
    2. leggiti bene sulla programmazione ad oggetti, sugli ambienti managed e sul garbage collector, magari un linguaggio managed non si adatta bene alle tue esigenze (e mica java deve andare bene per tutto).
    RTFM Read That F*** Manual!!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da dinoala
    quando clicco sul bottone della homepage per andare ad esempio nel pannello INSERISCI CLIENTE, vorrei che tutto ciò che ho istanziato precedentemente per la homepage mi venga cancellato, questo perchè quando vado a far click sul bottone HOME del pannello INSERISCI CLIENTE io devo tornare indietro, pertanto allocherei memoria per un nuovo oggetto HOMEPAGE (e quindi ho gia 2 oggetti homepage creati ed un oggetto INSERISCI CLIENTE che vorrei anche eliminare)
    Tu ti stai preoccupando/allarmando del fatto che il vecchio pannello home sia ancora lì in memoria dopo che l'utente è stato secondi e secondi, magari minuti sul pannello di inserisci cliente. Quando l'utente decide di ritornare alla home, è molto molto molto molto (e aggiungo molto molto) probabile che il vecchio pannello home (e tutto il contenuto) sia già stato recuperato e liberato dal g.c.
    A patto ovviamente che tutto quel pannello/contenuto fosse davvero "eleggibile" per il g.c. cioè che nulla di esso fosse più "raggiungibile".

    È vero che sul g.c. non ci sono garanzie esplicite e che comunque di norma "gira" in un thread a più bassa priorità. Ma non è che fa come certi addetti alla nettezza urbana che dovrebbero passare al mattino ma poi passano al pomeriggio e magari hanno fretta e saltano un bidone di qua e di là ....

    Originariamente inviato da dinoala
    A quanto pare java è un ottimo alleato di chi produce RAM!!!
    mi sembra quindi capire che java non è un linguaggio "serio" sotto certi termini...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    67
    Grazie ragazzi per avermi risposto. Alla fine ho adottato una soluzione che in parte mi lascia contento suggerita anche da valia.

    Praticamente negli actionlistener oltre a settara a false la visibilità del pannello contenitore gli assegno un bel NULL e poi mi istanzio un altro oggetto che crea il pannello desiderato.

    Ho monitorato la memoria facendo diverse volte (intendo una cinquantina almeno) avanti ed indietro con i pulsanti istanziando quindi oggetti, pannelli e cavolate varie ed i consumi di memoria sembrano stabili. Non vorrei sbagliarmi ma sembra una soluzione idonea alle mie esigenze. Anche perchè ho valutato che non mi conviene istanziare tutti gli oggetti fin da subito perchè molti non verrebbero utilizzati frequentemente!

    Stando al conto di valia, questa soluzione dovrebbe andare bene. Quando setto a NULL un pannello contenitore è come se "azzerassi" o cancellassi il suo contenuto? Che succede esattamente ai componenti in questo contenuti?

    x andbin
    beh in teoria essendo il GC un thread, a bassa priorità pergiunta, potrebbe non essere mai chiamato e quindi non funzionare...sta a vedere sotto quale algoritmo di scheduling girano i thread di java...magari con un'opzione di "aging" ben implementata (se così si scrive...ma mi sembra di ricordare di si) non dovrebbe ritardare mai all'infinito l'invocazione del GC ... credo...

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    cosa succede quando setti a NULL un puntatore in C?
    Cmq ho l'impressione che ti stai facendo troppe pippe mentali per il gc, davvero se ti interessa deallocare direttamente passa a C++
    RTFM Read That F*** Manual!!!

  10. #10
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Allora, Java introduce, così come altri linguaggi vedi C#, il concetto del garbage collector prp x risolvere una delle maggiori spine nel fianco dei "vecchi" programmi, il memory leak.
    Si è infatti dimostrato ke in prog grandi molti programmatori allocano e poi nn deallocano, oppure nn lo fanno alla giusta frequenza cl risultato di causare errori dovuti all'aging (t è mai capitato un prog ke, se rimane aperto x un certo tempo, ti rallenta il sistema?: ecco, quello è a causa dei memory leaks! ).

    Venendo anke io dal C mi feci anke io i tuoi stessi problemi, ma poi scoprii il garbage collector e..evvai!xD
    Tieni conto ke l'algoritmo del GC, a partire dagli anni 90, si è evoluto parecchio e adesso è altamente efficiente, quindi nel 99% dei casi nn dovrai mai preoccuparti: certo se stai facendo un software real time allora nn lo farai mai in java, la ti serve determinismo...ma cn applicazioni desktop vai tranquillo anke xke se presuppongono molta interazione cn l'utente i threads switchano a molti ordini di grandezza + velocemente dell'utente + veloce (se mi passi il gioco di parole).

    Quindi nn è ke java fa skifo, anzi...il futuro è prp del garbage collector e praticamente tutti i nuovi linguaggi di programmazione hanno la loro implementazione del GC.

    Settare a NULL un riferimento java...nn serve quasi a nulla.
    Cioè..forse,facendogli perdere il riferimento, riesci in qualke modo a far accorgere prima il GC ke quell'oggetto può essere deallocato, ma a conti fatti nn penso guadagnerai molto, specialmente se i metodi in cui si trova quell'oggetto sn molto "rapidi" a chiudersi, inoltre rendi il tuo codice molto + brutto e meno manutenibile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.