Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2016
    Messaggi
    11

    SWAP LINUX e GARBAGE COLLECTOR

    Ciao Forum!....Ho un programma C che fa' uso intensivo di Swap LInux (80 Gb), lo uso per implementare un algoritmo di ordinamento su memoria esterna; posso ordinare 5 miliardi di dati interi in circa 30 minuti...e un incremento notevole delle prestazioni si ottiene liberando la memoria allocata dinamicamente quando non è piu' necessaria; deallocando con free(), e aprendo Monitor di Sistema, posso vedere la quantita' di swap utilizzata, scendere sempre di piu' fino a svuotarsi completamente, con conseguente notevole incremento di velocita' nell'esecuzione di uno stesso ciclo di istruzioni; dopo aver tradotto in Java questo programma, tutto procede come per il C, tranne per il fatto che non potendo deallocare manualmente lo swap, questo rimane allocato a 80 Gb fino alla terminazione (anche ponendo a null tutti i riferimenti a oggetti non piu' coinvolti), con conseguente notevole rallentamento dell'esecuzione che termina dopo un ora , quindi in un tempo doppio rispetto al programma C; mi devo rassegnare all'inadempienza runtime della garbage collection oppure si puo' fare qualcosa?
    P.S. La chiamata manuale System.gc() l'ho provata e peggiora solo le cose...(paradossalmente fa' salire di piu' lo swap utilizzato ..)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Chiariamo subito una cosa. Lo swap file e/o partition (a seconda del S.O.) è gestito in automatico dal sistema operativo per la gestione della memoria "virtuale", per dare l'impressione di avere più memoria di quella fisica "swappando" pagine di memoria meno usate tra RAM e disco. La teoria .. beh è questa in sostanza.

    Detto in generale, queste cose NON le gestisci da programma, né da C, né da Java (tantomeno da Java!!) né credo con qualunque altro linguaggio. Detto in altro modo (e ripeto, sempre generalizzando): da codice NON puoi dire al sistema di fare qualcosa con lo swap file/partition (aumentarlo .. ridurlo, rimuoverlo ...). Ripeto: a meno che il S.O. metta a disposizione una API super-specializzata per questo. Ma sicuramente non da Java.

    In un programma, in generale, tu chiedi di allocare blocchi di memoria nello spazio di indirizzamento virtuale del processo. In C è una malloc (o altra funziona "nativa" del S.O.) in Java è es. un new int[numeroMoltoAlto] o new ClasseMoltoCorposa()
    Cosa faccia il sistema in termini di quanto "swap" questo comporti su disco dipende ovviamente da cosa sta facendo, da quanto hai richiesto di memoria, dove/quando/quanto accedi alla memoria, ecc..

    Java ha il "heap space", è lì che vengono allocati gli oggetti. Un heap space ha un valore iniziale e un massimo, che si possono anche impostare quando avvii la JVM. Oltre il massimo non puoi richiedere più memoria per gli oggetti dopo che la JVM è stata avviata.
    Generalmente l'utilizzo della memoria virtuale del processo della JVM decresce poco (o niente) se tu rendi eleggibili per il GC gli oggetti.
    C'è differenza (molta) tra la occupazione sul heap space e quanto avviene nativamente a livello di memoria del processo della JVM.

    Questo è un comportamento che in parte si può migliorare con delle opzioni ultra-specifiche (e non standard) della JVM.

    Vedi ad esempio le opzioni della JVM HotSpot di Oracle:
    Java HotSpot VM Options

    in particolare l'opzione -XX:MaxHeapFreeRatio


    E per finire: senza sapere o vedere bene cosa fa il tuo programma Java, non potrei certamente dirti se usa bene gli oggetti, se male o che altro.



    P.S. e lo ribadisco di nuovo: C, C++, Java, (altro...), heap space NON hanno nulla a che fare direttamente con gli swap file/partition.
    Ultima modifica di andbin; 26-10-2016 a 21:30
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2016
    Messaggi
    11
    .. Grazie andBin.!.......io credo che hai centrato il problema...dicendo:
    Generalmente l'utilizzo della memoria virtuale del processo della JVM decresce poco (o niente) se tu rendi eleggibili per il GC gli oggetti.
    C'è differenza (molta) tra la occupazione sul heap space e quanto avviene nativamente a livello di memoria del processo della JVM..
    in altre parole quando il processo della JVM diventa troppo grande per la Ram, ed entra in gioco lo swap...si tratta di una trasformazione irreversibile...garbage recupera (se necessario) solo heap...niente swap....il C invece rilasciando direttamente (malloc/free) quanto allocato permette al S.O di liberare Swap..e di conseguenza alla Ram di riprendere il controllo diretto degli oggetti ancora da elaborare....ora provo a compilare con quella opzione della JVM cui hai fatto riferimento e domani ti riferisco...
    P.S. Un enorme vantaggio di Java rispetto al C...che ho trovato.;...im C non posso caricare un albero con piu di 100 Milioni di nodi..in Java ho compilato senza problemi per 200 MIlioni di nodi (ma non è il limite) e si puo' sicuramente crescere...(ancora non so' di quanto)...
    Ultima modifica di JFrank0; 26-10-2016 a 22:59

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.