2009-01-11 39 views
7

Tôi đang cố gắng tìm ra lập trình kích thước tối đa permgen và tối đa heap mà một JVM cho chương trình của tôi đã được gọi, không phải những gì hiện đang có sẵn cho họ.Làm thế nào để có được kích thước tối đa của heap và permgen từ JVM?

Có cách nào để làm điều đó không?

Tôi quen thuộc với các phương pháp trong đối tượng Java Runtime, nhưng không rõ ràng những gì chúng thực sự phân phối.

Ngoài ra, có cách nào để hỏi Eclipse số tiền đã được phân bổ cho hai loại này không?

Trả lời

7

Hãy thử những điều này:

MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); 
mem.getHeapMemoryUsage().getUsed(); 
mem.getNonHeapMemoryUsage().getUsed(); 

Nhưng họ chỉ cung cấp dữ liệu ảnh chụp, không phải là một giá trị cummulated.

+1

Lưu ý rằng bộ nhớ không phải Heap cũng bao gồm Bộ nhớ cache mã, tách biệt với Thế hệ vĩnh viễn. (ít nhất là trong JVM của Sun) –

0

Vì nhật thực, hãy thử tìm công cụ lược tả. Tôi nghĩ NetBeans có một mặc định.

+0

Tôi đang cố gắng thực hiện điều này từ một chương trình để tôi có thể cung cấp cho người dùng một cảnh báo nếu họ sử dụng ít hơn plugin của tôi sẽ yêu cầu. – Uri

+0

Tôi hiểu lầm câu hỏi của bạn. Tôi nghĩ rằng đây là một câu trả lời tốt hơn. – pek

8

Hãy thử một cái gì đó như thế này cho perm max gen:

public static long getPermGenMax() { 
    for (MemoryPoolMXBean mx : ManagementFactory.getMemoryPoolMXBeans()) { 
     if ("Perm Gen".equals(mx.getName())) { 
      return mx.getUsage().getMax(); 
     } 
    } 
    throw new RuntimeException("Perm gen not found"); 
} 

Đối với đống max, bạn có thể có được điều này từ Runtime, mặc dù bạn cũng có thể sử dụng MemoryPoolMXBean thích hợp.

+1

Hãy cẩn thận như thể bạn kích hoạt CMS tên bean MX là "CMS Perm Gen". Bạn có thể thay thế "Perm Gen" .equals (mx.getName()) bởi mx.getName(). EndsWith ("Perm Gen") để làm cho nó hoạt động trong trường hợp đó. –

+0

Không biết nó phụ thuộc vào cái gì nhưng đối với tôi đây là "PS Perm Gen". :-) –

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