2012-03-16 41 views
9

Tôi sẽ chạy một thuật toán di truyền trên máy tính của bạn cùng phòng cho cả tuần, và tôi sợ rằng nó có thể hết bộ nhớ trong một thời gian dài như vậy. Tuy nhiên, thuật toán của tôi hoạt động theo cách giúp dễ dàng cắt bớt các kết quả kém hữu ích, vì vậy nếu có cách để biết khi nào chương trình sắp hết dung lượng, tôi có thể tạo chỗ và tiếp tục thêm thời gian.Chương trình Java có thể phát hiện rằng nó đang chạy thấp trên không gian heap?

Có cách nào để được thông báo khi JVM đang hết dung lượng lưu trữ, trước OutOfMemoryError không?

+0

bản sao có thể có của [Cách theo dõi động Java kích thước heap?] (Http://stackoverflow.com/questions/2163228/how-to-dynamically-monitor-java-heap-size) –

+0

@Andreas_D, câu hỏi này xử lý về giám sát chương trình bên ngoài. Tôi muốn chương trình của riêng tôi phản ứng khi nó sắp hết dung lượng. – zneak

+0

câu trả lời cho câu hỏi khác bao gồm các giải pháp giám sát nội bộ và bên ngoài. –

Trả lời

6

Bạn có thể đăng ký javax.management.NotificationListener được gọi khi một ngưỡng nhất định được nhấn.

Something như

final MemoryMXBean memBean = ManagementFactory.getMemoryMXBean(); 
final NotificationEmitter ne = (NotificationEmitter) memBean; 

ne.addNotificationListener(listener, null, null); 

final List<MemoryPoolMXBean> memPools = ManagementFactory 
    .getMemoryPoolMXBeans(); 
for (final MemoryPoolMXBean mp : memPools) { 
    if (mp.isUsageThresholdSupported()) { 
    final MemoryUsage mu = mp.getUsage(); 
    final long max = mu.getMax(); 
    final long alert = (max * threshold)/100; 
    mp.setUsageThreshold(alert); 

    } 
} 

đâu nghe là thực hiện của riêng bạn NotificationListener.

+0

Điều đó trông rất giống với những gì tôi muốn. Tôi sẽ thử. – zneak

+0

Tôi sử dụng phương pháp này trong http://code.google.com/p/pitestrunner/ nếu bạn muốn một ví dụ. Hãy tìm lớp MemoryWatchdog và nó được sử dụng bởi MutationTestSlave. – henry

+0

Đừng quên thêm bộ lọc khi đăng ký, tức là: Bộ lọc thông báoFilter = x -> MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED.equals (x.getType()); ne.addNotificationListener (tryPreventOom, filter, null); –

3

Bạn có thể thử này:

// Get current size of heap in bytes 
long heapSize = Runtime.getRuntime().totalMemory(); 

// Get maximum size of heap in bytes. The heap cannot grow beyond this size. 
// Any attempt will result in an OutOfMemoryException. 
long heapMaxSize = Runtime.getRuntime().maxMemory(); 

// Get amount of free memory within the heap in bytes. This size will increase 
// after garbage collection and decrease as new objects are created. 
long heapFreeSize = Runtime.getRuntime().freeMemory(); 

Như tìm thấy ở đây - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html

+0

Tôi cho rằng điều này có thể làm cho một hack không sao, nhưng tôi muốn được thông báo tự động khi một ngưỡng nhất định được đáp ứng, thay vì phải thăm dò tình trạng bộ nhớ tại một khoảng thời gian nhất định (giống như thông báo bộ nhớ trên iOS). – zneak

+0

Tôi không biết bất kỳ cách nào khác để được thông báo tự động dựa trên một ngưỡng nhất định trừ khi bạn tự viết bản thân mình để làm điều này trong nền. – Nikhil

1

Chỉ cần sử dụng WeakReferences về kết quả discardable, sau đó họ sẽ bị hủy nếu cần thiết vì lý do không gian.

+0

Tôi không thể để nó theo quyết định của GC, vì tôi cần xem xét các đối tượng trước khi quyết định chúng có thể xóa được. – zneak

+0

+1: Hoặc sử dụng SoftReferences dài hơn, WeakReference luôn bị loại bỏ trên GC. Bạn có thể giữ một ReferenceQueue để được thông báo về đối tượng có thể được dọn sạch. –

0

Tôi không chắc chắn về điều này, nhưng không thể JConsole giải quyết mục đích của bạn ??

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