2016-03-01 14 views
8

Tôi đang nghiên cứu về Java JMXJConsole. Tôi tò mò về khả năng quản lý bộ nhớ của JConsole. Ví dụ, có một nút "Thực hiện GC" trong tab Memory:JConsole của Java có thể được sử dụng để tự động cấu hình bộ nhớ không?

enter image description here

Giả sử tôi có ứng dụng Java đơn giản mà ăn lên bộ nhớ, một cái gì đó như thế này:

public class MemoryEater 
{ 
    public static void main(String[] args) 
    { 
    Vector v = new Vector(); 
    while (true) 
    { 
     byte b[] = new byte[1048576]; 
     v.add(b); 
     Runtime rt = Runtime.getRuntime(); 
     System.out.println("free memory: " + rt.freeMemory()); 
    } 
    } 
} 

Nên có một cách để cấu hình JConsole để ngăn chặn ứng dụng này tiêu thụ số lượng bộ nhớ X? Hay tôi cần tạo một MBean mới qua JMX? cảm ơn

+2

Bạn có thể cấu hình bao nhiêu bộ nhớ quá trình Java có thể tiêu thụ như một tùy chọn khởi động dòng lệnh. Tôi không nghĩ rằng điều này có thể được thay đổi trong thời gian chạy. http: // stackoverflow.com/questions/763295/setting-jvm-heap-size-at-runtime – Thilo

+1

Nếu bạn lo lắng về một cá thể JVM ăn hết bộ nhớ hệ điều hành, bạn có thể giới hạn kích thước heap của JVM bằng -Xmx64m, nơi bạn có thể thay thế 64m để chỉ định kích thước heap tối đa cho phép của bạn tính bằng megabyte. –

Trả lời

3

Có cách nào để định cấu hình JConsole để ngăn ứng dụng này bị tiêu thụ lượng bộ nhớ X không?

Từ JConsole, chúng tôi không thể điều chỉnh/kiểm soát giới hạn bộ nhớ. Chỉ có tùy chọn tôi thấy đang sử dụng -Xmx khi khởi động quá trình java. Nhìn vào ảnh chụp màn hình dưới đây, JConsole cho thấy các thông số bộ nhớ chỉ có thể đọc được nhưng không thể ghi được.

JConsole memory parameters readonly


Hoặc làm tôi cần phải thực hiện một MBean mới qua JMX?

Thậm chí nếu chúng tôi viết MBean của riêng mình, tôi không nghĩ rằng có thể thay đổi giới hạn bộ nhớ của quá trình java khi chạy. Cách duy nhất là định cấu hình giới hạn bộ nhớ trong khi khởi động bằng cách sử dụng -Xms-Xmx. Trừ khi câu hỏi là cụ thể cho mã ví dụ của bạn, nơi bạn muốn giới hạn số lượng thành phần có thể được thêm vào Vector thông qua JMX Bean và ở đó bằng cách giới hạn mức tiêu thụ bộ nhớ, điều này có thể thực hiện được, nhưng tôi nghi ngờ nếu đó là những gì bạn đang tìm kiếm.

0

Không, bạn không thể. Quản lý bộ nhớ Java là trách nhiệm của người thu gom rác và các nhà phát triển phần mềm thực tế. Bạn có thể tinh chỉnh cấp phát bộ nhớ với các kiểu tham chiếu khác nhau (như tham chiếu mềm), điều chỉnh tham số GC và thuật toán hoặc cố gắng buộc GC gọi bằng lệnh JMX hoặc jcmdGC.run tiện ích. Nhưng bạn không thể thay đổi ranh giới bộ nhớ để chạy JVM hoặc đặt high-water-mark cho khả năng chiếm dụng heap.

Nếu bạn cần một chiến lược khác để quản lý bộ nhớ trong Java, hãy xem các sản phẩm như Terracotta BigMemory.

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