2011-06-27 54 views
5

Tôi đang sử dụng Eclipse. Vấn đề là ứng dụng của tôi bị treo nếu bộ nhớ được phân bổ nhỏ hơn 512MB. Bây giờ là có anyway để kiểm tra bộ nhớ có sẵn cho một chương trình trước khi bắt đầu xử lý toàn bộ bộ nhớ nặng? Ví dụ, tôi biết chúng tôi có thể kiểm tra sẵn JVM kích thước heap như:Kiểm tra heapSize sẵn có lập trình?

long heapSize = Runtime.getRuntime().totalMemory(); 
System.out.println("Heap Size = " + heapSize); 

Vấn đề là, điều này mang lại kích thước heap JVM. Thậm chí tăng nó không hoạt động bằng Eclipse. Trong Eclipse, nếu tôi thay đổi các đối số VM thì nó hoạt động. Tuy nhiên bản in từ các câu lệnh trên luôn giống nhau. Có lệnh nào mà qua đó tôi có thể biết chính xác tôi đã cấp phát bộ nhớ cho một ứng dụng cụ thể không?

+0

có thể vấn đề là nhật thực. Bạn đã thử Netbeans hay IntelliJ chưa? – telm

+0

tôi đã thử, kết quả tương tự với bất kỳ Thời gian chạy IDE – Johnydep

+0

nào có cả totalMemory() và maxMemory(). maxMemory lớn hơn trong kinh nghiệm của tôi. –

Trả lời

13

Bạn có thể sử dụng JMX để thu thập việc sử dụng bộ nhớ heap khi chạy.


Mã số Ví dụ:

import java.lang.management.ManagementFactory; 
import java.lang.management.MemoryPoolMXBean; 
import java.lang.management.MemoryType; 
import java.lang.management.MemoryUsage; 

for (MemoryPoolMXBean mpBean: ManagementFactory.getMemoryPoolMXBeans()) { 
    if (mpBean.getType() == MemoryType.HEAP) { 
     System.out.printf(
      "Name: %s: %s\n", 
      mpBean.getName(), mpBean.getUsage() 
     ); 
    } 
} 

Output Ví dụ:

Name: Eden Space: init = 6619136(6464K) used = 3754304(3666K) committed = 6619136(6464K) max = 186253312(181888K) 
Name: Survivor Space: init = 786432(768K) used = 0(0K) committed = 786432(768K) max = 23265280(22720K) 
Name: Tenured Gen: init = 16449536(16064K) used = 0(0K) committed = 16449536(16064K) max = 465567744(454656K) 

Nếu bạn có câu hỏi về "Eden Space" hoặc "Survivor Space", hãy kiểm tra How is the java memory pool divided

+0

Yess nhưng nó giúp ích rất nhiều. Tôi chỉ muốn biết tổng số bộ nhớ được cấp phát cho ứng dụng của tôi bằng JVM hoặc một cái gì đó như thế này. Từ cấu hình tôi biết nếu nó là ít hơn 512MB, nó dosent 'làm việc. Nhưng làm thế nào tôi có thể kiểm tra này thực dụng bởi vì một khi ứng dụng này được đóng gói, nếu nó bị rơi vào thời gian chạy, cần có một mecahnism để nhắc người dùng về bản chất của lỗi. Trong trường hợp xấu hơn tôi sẽ bắt ngoại lệ và nhắc người dùng tăng kích thước bộ nhớ, nhưng điều đó sẽ xảy ra sau sự cố, nhưng không phải trước khi bắt đầu. Unfortuanatelly nó mất khoảng 30 phút trước khi nó bị treo và nó sẽ là một sự lãng phí thời gian. – Johnydep

+0

Bạn đã đặt JAVA_OPTS hoặc CATALINA_OPTS chưa? Điều gì về tham số '-Xmx' (kích thước heap tối đa)? Có lẽ nó bị treo vì nó hết bộ nhớ ở một thời điểm nào đó? Các tệp nhật ký nói gì, có lỗi outOfMemory nào không? – Danijel

0

Làm thế nào về ý tưởng này? Bạn có thể kiểm tra số JVM command line with this API.

Sau đó, bạn có thể quét dòng lệnh cho các thông số -Xmx… để đảm bảo có quy định đủ lớn.

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