2009-06-04 32 views
15

Tôi đang viết trình cài đặt sẽ điều chỉnh cấu hình của sản phẩm cho phần cứng cụ thể mà trên đó nó sẽ được chạy. Đặc biệt, tôi muốn xác định có bao nhiêu RAM vật lý được cài đặt trong hệ thống để tôi có thể ước tính lượng bộ nhớ cần phân bổ cho sản phẩm khi nó chạy. Lý tưởng nhất, tôi muốn làm điều này theo cách Java độc lập, nền tảng, vì trình cài đặt sẽ cần chạy trên nhiều nền tảng khác nhau, nhưng trong trường hợp điều này là không thể, các giải pháp cho Windows được ưu tiên như đó là nền tảng triển khai phổ biến nhất.Làm cách nào để tìm kích thước bộ nhớ vật lý trong Java?

Trong trường hợp này, có thể giả định rằng sản phẩm sẽ là ứng dụng duy nhất/chính chạy trên hộp, vì vậy tôi không phải lo lắng về việc ép bất kỳ ai khác ra ngoài. Tôi không muốn phân bổ quá mức như thế này, theo kinh nghiệm của chúng tôi, có thể làm tổn thương hiệu suất.

+0

Nếu cài đặt của bạn là trong java - nó sẽ chỉ làm việc nếu JRE đã được cài đặt ... – Nate

+0

Cảm ơn - trong trường hợp này, JRE là một trong những yêu cầu niêm yết của phần mềm, vì vậy chúng tôi cho phép giả định nó có :) –

+0

thậm chí thông qua JMX là không thể – dfa

Trả lời

3

Đối với cửa sổ, bạn cần phải truy cập WMI - thao tác này sẽ giúp bạn: Accessing Windows Management Instrumentation (WMI) from Java.

Bạn sẽ muốn sử dụng phần này của WMI: Win32_LogicalMemoryConfiguration.

Có thể có một cách java thuần túy để làm điều này, nhưng tôi không biết về nó.

+0

Cảm ơn! Có vẻ như lớp đó không được hỗ trợ trong XP & Server 2003 và không có trong Vista trở đi (http://msdn.microsoft.com/en-us/library/aa394181(VS.85).aspx). Rõ ràng Win32_OperatingSystem là sự thay thế của nó. –

+0

Có các phiên bản cửa sổ khác nhau hỗ trợ các Lớp WMI khác nhau. Bạn sẽ cần điều chỉnh dựa trên hệ điều hành đích của mình. – Nate

1

Trong linux, bạn có thể sử dụng sysinfo(2). Tôi không nghĩ rằng nó thực sự có thể từ java thuần túy.

+0

Chúc mừng - có lẽ tôi phải gọi qua JNI? –

+0

Vâng đó là tòa nhà C syscall. Từ một cmdline bạn có thể phân tích các kết quả từ miễn phí (1), tôi khá chắc chắn có một cách tốt hơn nhưng không thể nghĩ ra ngay bây giờ. Bạn có thể hình dung tất cả điều này trong một kịch bản shell hoặc gói mà người dùng sử dụng để cài đặt ứng dụng của bạn, thay vì sử dụng jni. – wds

4

Nếu ý định của bạn là điều chỉnh cài đặt bộ nhớ cho JVM để sử dụng tất cả bộ nhớ vật lý hiện có, nhưng không nhiều hơn, thì bạn có thể xem tham số -XX: + AggressiveHeap.

Với nó, bạn không cần biết bộ nhớ khả dụng. JVM sẽ tự động điều chỉnh thông số của nó.

17

Bạn có thể sử dụng mã Java sau đây để truy vấn bộ nhớ vật lý:

com.sun.management.OperatingSystemMXBean os = (com.sun.management.OperatingSystemMXBean) 
    java.lang.management.ManagementFactory.getOperatingSystemMXBean(); 
long physicalMemorySize = os.getTotalPhysicalMemorySize(); 

Nhưng gói com.sun.management là không bắt buộc và không cần phải có sẵn trên mọi nền tảng.

+1

IMHO, đây là câu trả lời hay nhất. workd trên linux cũng như windows. không cần phải đối xử đặc biệt với WMI cho các cửa sổ ... –

+2

Lưu ý rằng khi sử dụng một JVM 32 bit này sẽ không bao giờ quay trở lại nhiều hơn 4GB. – berry120

+0

Cảm ơn, tốt. Đây là những gì tôi cần. Tôi sẽ tạo ra giải pháp C++ và gọi nó từ chương trình Java của tôi. –

3

Còn JMX và MBeans cục bộ thì sao? Hãy thử điều này:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang","type","OperatingSystem"), "TotalPhysicalMemorySize"); 
System.out.println("Total memory: "+ attribute.toString() +" B"); 

Bạn có thể truy cập nhiều thông tin hữu ích theo cách này.

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