2011-06-02 30 views
10

Tôi đang cố tính toán số lượng bộ nhớ có sẵn cho chương trình Java của mình. Tôi có triển khai hiện tại này:Cách tốt nhất để tính toán bộ nhớ có sẵn trong Java là gì?

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; 
} 

Đúng vậy không? Có cách nào dễ dàng hơn/chính xác hơn để tính toán thông tin này không? Sau khi xem mã của người khác, tôi thấy một cái gì đó như thế này hơi khác:

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; 
} 

Dù sao thì, cách nào đúng để nhận thông tin này?

+1

Giải pháp của bạn có vẻ đúng với tôi. – Adrian

+0

Tôi nghĩ chúng giống nhau nhưng bây giờ tôi thấy cái thứ 2 chỉ cung cấp cho bạn (tối đa là tổng số). – trutheality

+1

Tôi nghĩ bạn nên đặt một phần câu hỏi của mình như một câu trả lời, để điều này có thể được nộp bằng một câu hỏi được trả lời. [Tôi có nên trả lời câu hỏi của riêng mình] (http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions) – Jarekczek

Trả lời

8

Bạn giải pháp có vẻ đúng với tôi (nhận xét dưới đây để giải thích những gì bạn đang tính toán):

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; 
} 

Tôi không chắc chắn những gì trường hợp sử dụng của bạn là nhưng cũng có giới hạn trong đống bạn có thể muốn để xem xét như kích thước PermGen: How do I programmatically find out my PermGen space usage?

Các vấn đề liên quan