2011-06-02 9 views
10

Estoy tratando de calcular cuánta memoria hay disponible para mi programa Java. tengo esta implementación actual:¿Cuál es la mejor forma de calcular la memoria disponible en Java?

long getAvailableMemory() { 
    Runtime runtime = Runtime.getRuntime(); 
    long totalMemory = runtime.totalMemory(); 
    long freeMemory = runtime.freeMemory(); 
    long maxMemory = runtime.maxMemory(); 
    long usedMemory = totalMemory - freeMemory; 
    long availableMemory = maxMemory - usedMemory; 
    return availableMemory; 
} 

¿Es eso cierto? ¿Hay una forma más fácil/más precisa de calcular esta información? Después de mirar a alguien código otra cosa, vi algo como esto que es ligeramente diferente:

long getAvailableMemory() { 
    long totalVmHeap = Runtime.getRuntime().totalMemory(); 
    long freeVmHeap = Runtime.getRuntime().freeMemory(); 
    long usedVmHeap = totalVmHeap - freeVmHeap; 
    long maxVmHeap = Runtime.getRuntime().maxMemory(); 
    long availableVmHeap = maxVmHeap - usedVmHeap + freeVmHeap; 
    return availableVmHeap; 
} 

De todos modos, ¿cuál es el camino correcto para llegar a esta información?

+1

Su solución me parece correcta. – Adrian

+0

Pensé que eran lo mismo pero ahora veo que el segundo te acaba de dar (máximo - total). – trutheality

+1

Creo que debe poner parte de su pregunta como respuesta, para que esta pueda ser presentada como una pregunta respondida. [Debo responder mis propias preguntas] (http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions) – Jarekczek

Respuesta

8

solución Usted parece correcto para mí (comentado más adelante para explicar lo que está calculando):

long getAvailableMemory() { 
    Runtime runtime = Runtime.getRuntime(); 
    long totalMemory = runtime.totalMemory(); // current heap allocated to the VM process 
    long freeMemory = runtime.freeMemory(); // out of the current heap, how much is free 
    long maxMemory = runtime.maxMemory(); // Max heap VM can use e.g. Xmx setting 
    long usedMemory = totalMemory - freeMemory; // how much of the current heap the VM is using 
    long availableMemory = maxMemory - usedMemory; // available memory i.e. Maximum heap size minus the current amount used 
    return availableMemory; 
} 

No estoy seguro de lo que su caso de uso es, pero también hay límites en el montón es posible que desee para mirar como el tamaño de PermGen: How do I programmatically find out my PermGen space usage?

Cuestiones relacionadas