Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    137

    Conoscere lo spazio occupato da ogni cosa

    Avrei bisogno di conoscere quanto occupa ogni variabile o classe in java. Nel programma che sto scrivendo ho la neccessita' di consumare il meno spazio possibile. Dove posso trovare un sito che illustri le dimensioni associate ad ogni classe variabile riferimento? Come IDE uso eclipse dal quale ho scaricato il plug in test and profiling ma non capisco come funzioni il tab che illustra lo spazio occupato dall'applicazione eseguita. Nel senso che non riesco a comprendere i risultati ottenuti.

    Inoltre una conferma. Se ogni intero occupa 4byte, allora se creo un array di 500000 int riempiti con un banale ciclo da numeri interi positivi che vanno da 0 a 500000, dovrei ottenere piu' o meno un'occupazione della memoria pari a 2 mega. Solo che se guardo nei processi ottengo uno spazio occupato pari a ben 18 mega, se testo con il plug citato sopra, non ottengo alcun numero che ci si avvicini. Dove ho sbagliato nel "calcolo"? C'e differenza di peso tra un int e un Integer (classe)?

    Infine, so che la Vm quando si avvia, carica con se molte informazioni che vanno a incidere sul peso in memoria non poco. Sapete se ce un modo per personalizzare cio' che va a caricare la VM?
    Insomma, che aiuti potete darmi sulla conoscenza e ottimizzazione dello spazio in memoria?
    Grazie mille!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    137
    nulla? a nessuno stima il peso del proprio programma?

  3. #3
    Ricorda google è tuo amico: http://www.idevelopment.info/data/Pr...ive_Types.html


    Uno dei tanti link trovati.

    Quando avvi una programma Java, esso come sai gira nella sua VM, che viene avviata con un tot di ram a sua disposizione, in cui fa le sue porcate, tale valore lo puoi controllare passando due paramentri al comando java che dovrebbero essere -Xmx per indicare quanta memoria al massimo vuoi dedicare alla VM e -Xmn per il valore minimo da indicare (es: java -Xmx256M) ovviamente stringere troppo la memoria puo' portarti ad un bel OutOfMemoryError, con relativo crash dell'applicazione.

    Come credo tu saprai esiste un garbage collector, che serve a ripulire la memoria non più utilizzata è possibile chiamarlo esplicitamente dal tuo programma, ma cio si riflettera con degli stalli della tua applicazione nel momento dell'esecuzione, con relativa incassatura dell'utente

    Quest'altro articolo forse ti potrà essere di aiuto: http://www.javaworld.com/javaworld/j...avatip130.html

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2003
    Messaggi
    137
    grazie ma mi rimane in mistero una cosa. Provo ad instanziare un banale int e chiedo con Runtime.totalMemory()-Runtime.freeMemory() lo spazio occupato, e, sia con la var istanziata sia senza alcuna istruzione, il valore restituito è 161408 byte... come mai? (dal task memager il processo invece pesa la bellezza di 6.5mb). Invece, se istanzio un array di int con lunghezza 500000 e lo riempio, il peso occupato è di ben 10 mega invece dei 2 (circa) calcolati (500000*4byte = 2000000byte)? Come mai? E ancora, se istanzio una seguito l'altra 10 int e li riempio, lo spazio occupato da 161408 passa a 161432, con occupati 26 byte invece di 40byte, o meglio se prima e dopo l'istanza dei 10 int chiamo la gc, il risultato è sempre uguale! Come è possibile? Non ci sto a capire assolutamente niente! Come mai lo spazio occupato dagli int non corrisponde?! :master:

  5. #5
    Quelle istruzioni ti danno, la dimensione dello Heap, che e' lo spazio di allocazione dinamica della JVM (non ne sono sicuro, dovresti verificare su internet) gli int (o meglio i tipi primitivi) non vanno a finire nello Heap ma nello Stack, quindi e normale che se allochi degli int non vedi modifiche grosse sullo Heap anche se comunque la memoria totale della JVM aumenta.

    Non e' che basta chiamare il GC è quello ti spazza via i dati, non sarebbe giusto, generalmente questo componente ha delle regole che variano in base all'implementazione java utilizzata (per la cronaca non esiste solo il jdk fornito da sun, ma anche altri). Comunque una regola che c'e' ovunque dice al GC di cancellare le variabili solo se non sono piu' utilizzate da nessuna parte (piu' o meno come dire var=null) e per come hai tentato tu di chiamare il GC, beh non puo' fare molto è tutto attualmente in uso.

    Comunque se hai questa premura di uso di ram, ti consiglierei
    1) passa a C/C++
    2) informati bene sulle specifiche della jvm
    3) forse fa al caso tuo j2me che e una versione di java per sistemi embedded, che sicuramente e' pensata per vivere con poca ram.



    Cao

  6. #6
    Guarda questo link: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html si riferisce a java5, spero sia applicabile anche alle altre versioni.

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.