Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306

    [Java] Curiosità su Input/OutputStream e Garbage Collector

    Ciao ragazzi.
    Ho notato una cosa abbastanza "strana": io ho una Socket della quale utilizzo gli InputStream e OutputStream per costruire rispettivamente un ObjectInputStream e un ObjectOutputStream. E fin qui tutto ok.
    Io uso senza problemi questi oggetti per comunicare con l'altro capo della Socket.
    Ora... io ho avuto la necessità, ad un certo punto, di chiudere questi Stream, per interrompere la comunicazione. Se uso il metodo close() dei due oggetti, tutto funziona perfettamente: all'altro capo ricevo una EOFException che gestisco tranquillamente.

    Il problema l'ho riscontrato nel momento in cui, al posto di utilizzare il metodo close(), ho optato per la "distruzione" dei due oggetti ObjectInputStream e ObjectOutputStream... Da quello che mi era stato detto, ponendo un oggetto a null, viene a mancare il riferimento all'oggetto ed il Grabage Collector dovrebbe entrare subito in azione, liberando la memoria e distruggendo l'oggetto stesso. Però questo non accade: l'oggetto, anche dopo essere stato posto a null, continua la sua esistenza e dall'altra parte della socket non ricevo alcuna eccezione. Anzi!! Se dall'altra parte l'applicazione invia dei dati, non si accorge nemmeno che i due canali sono stati distrutti!

    Premesso che ho ovviamente optato per l'utilizzo del metodo close() (che è anche più corretto da un punto di vista formale), secondo voi questo è un problema del Garbage Collector (quindi di Java) oppure è normale un comportamento simile?


    Grazie a quanti vorranno rispondere, azzardare un'ipotesi o anche solo dire la loro.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    è una caratteristica nota del garbage collector di java


    dunque: il meccanismo è relativamente semplice...
    la vm alloca memoria a gogo, mettendo classi qua e là..
    dato che in java non esistono puntatori visibili, tenere sotto controllo i riferimenti ad un dato ogetto è relativamente poco dispendioso.. dal momento in cui si tratta solo di passare al setaccio tutti i nomi di variabile dichiarati e tutti gli oggetti allocati, vedere quali non hanno un riferimento, ed eliminare quindi l'oggetto liberando spazio.
    Ora, visto così questo meccanismo sembra funzionante in ogni momento ma non è così, e ti spiego perchè.
    Questo processo, essendo un processo alquanto bastardo in termini di riduzione delle prestazioni del sistema, è stato ridotto ad essere chiamato solo in momenti di fabbisogno di memoria, ovvero, quando si sfonda il tetto della memoria fisica disponibile, o si tira giù l'intera VM. quindi, capita spessissimo, che durante tutto l'arco di vita dell'applicazione in realtà il GC non butti via niente, semplicemente perchè non ce n'è bisogno.

    Attraverso l'utilizzo di System.gc(), noi possiamo però forzare l'esecuzione del garbage collector, ma è probabile che nel tuo caso nemmeno funzioni, perchè in realtà il garbage collector non si limita a fare solo controllo e deallocazione, ma bensì ha un meccanismo un pò più complesso rispetto a come ti ho accennato sopra in "grandi linee".. per renderti l'idea considera che parte ogni tot tempo, ed effettua però solo la "marcatura" delle allocazioni che è possibile eliminare senza problemi.. marcature che poi distrugge realmente solo in caso di necessità di memoria.

    per ulteriori delucidazioni puoi provare a leggere qui, nella parte del garbage collector.

    http://www.mokabyte.it/1996/11/java_c++.htm

  3. #3
    dimenticavo, per questo motivo è sempre bene chiudere tutte le connessioni a DB

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Ti ringrazio per le risposte... in effetti avevo il dubbio che il Garbage Collector non agisse non appena vengono posti a null gli oggetti... mi era giunta una notizia falsa (capita spesso in ambito informatico, no? )

    Solo una cosa mi domando... come mai quando invio dei dati dall'altra parte della socket, non ricevo alcuna eccezione riguardo l'ovvio fallimento dell'operazione. Se ho una connessione client/server con una socket A nel client e una socket B nel server, se pongo a null lo stream di input di B dovrebbe sollevarsi un'eccezione nel momento in cui tento di inviare dei dati da A a B... ma questo non succede. Questi misteri...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Forse perchè quando metti a null il tuo oggetto Input/OutputStream non comunichi all'altro capo del collegamento che lo stesso è stato interrotto , e quindi i dati vengono cmq inviati .
    Mentre con la close() c'è una serie di passaggi che fa si che entrambe le parti siano consapevoli della chiusura.


    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Sì, infatti adesso lo chiudo usando il close()... quello che mi risultava "strano" era il fatto che non venisse generata nessuna eccezione nell'invio di dati a qualcosa di inesistente.

    Vabbè... come dice il titolo era una curiosità...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2024 vBulletin Solutions, Inc. All rights reserved.