2009-06-14 27 views
12

Như chúng ta đã biết, tùy chọn java -Xmx được sử dụng để đặt không gian heap tối đa có sẵn cho một chương trình Java. Nhưng có cách nào cho một chương trình Java để đọc giá trị đã được thiết lập? Một cái gì đó như System.getMaximumHeapSpace() (không tồn tại).Đọc không gian heap tối đa khi chạy

+0

Bản sao của http://stackoverflow.com/questions/433406/how-to-get-the-max-sizes-of-the-heap-and-permgen-from-the-jvm? – Pool

+0

Một cách không mang tính chương trình là chạy tiện ích 'jmap' có sẵn từ JDK của bạn. Cú pháp sẽ là 'jmap -heap '. Trường 'MaxHeapSize' cho biết giá trị' Xmx' được đặt trên tiến trình Java đó. – asgs

Trả lời

18

Có một Runtime.maxMemory, tài liệu cho biết sẽ trả lại số lượng bộ nhớ tối đa mà Máy ảo Java sẽ cố gắng sử dụng, nhưng nó không cụ thể cho dù đó là bộ nhớ heap tối đa được thiết lập khi khởi chạy JVM.

Cũng giống như một thử nghiệm, tôi đã viết chương trình sau đây:

class MaxMemory { 
    public static void main(String[] args) { 
     System.out.println(Runtime.getRuntime().maxMemory()); 
    } 
} 

Kết quả của việc thực hiện là như sau:

C:\coobird\>java -Xmx64m MaxMemory 
66650112 

C:\coobird\>java -Xmx128m MaxMemory 
133234688 

này được sử dụng Java SE 6 phiên bản 1.6.0_12 trên Windows .

Mặc dù các giá trị gần 64 MB (67,108,864 byte) và 128 MB (134,217,728 byte), chúng không chính xác như vậy.

+0

Tôi đã thử nghiệm nó và nó có vẻ là giá trị được thiết lập bởi -Xmx. Cảm ơn. –

+0

Nó có vẻ là gần gũi, nhưng không chính xác giá trị. – coobird

+0

Có thể các byte bị thiếu được dành riêng cho không gian PermGen –

3

Và tôi nhận được giá trị mà là xa hơn từ giá trị Xmx:

java -Xmx64m MaxMemory 
59703296 

64 * 1024 * 1024 = 67108864

java -Xmx128m MaxMemory 
119341056 

128 * 1024 * 1024 = 134217728

Đó là một 11% khác biệt! (Của bạn chỉ là 0,7%; Tôi thắng.)

java -version 
java version "1.6.0_22" 
Java(TM) SE Runtime Environment (build 1.6.0_22-b04) 
Java HotSpot(TM) Server VM (build 17.1-b03, mixed mode) 
running on Linux 2.6 
1

Tôi thấy kết quả tương tự.

-Xmx512m và tôi nhận được 455M

-Xmx1024m và tôi nhận được 910M

tôi nhận được kết quả tương tự sử dụng ManagementFactory.getMemoryMXBean(). GetHeapMemoryUsage()

Những sự khác biệt là quá lớn để được bỏ qua.

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