2011-12-02 23 views
23

Tôi đang khám phá việc sử dụng bộ nhớ trong Java để hiểu tại sao chương trình của tôi bị rò rỉ bộ nhớ. Sau khi ngắt mã trong vòng lặp chính của tôi, tôi vẫn nhận được sự gia tăng sử dụng bộ nhớ theo thời gian. Cân nhắc việc sử dụng bộ nhớ của một chương trình trống:Tại sao một chương trình Java trống sử dụng bộ nhớ?

class Nothing 
{ public static void main(String[] args) 
    { while(true); } 
} 

tôi vẫn thấy sự gia tăng bộ nhớ:

Image description here

Vì vậy, câu hỏi của tôi là: Tại sao có vẫn còn là một mô hình răng cưa? Tại sao khi GC chạy nó không lưu tất cả bộ nhớ (mỗi lần gc chạy (các thung lũng) bộ nhớ đã sử dụng tăng 10-20Kb (so với thung lũng trước đó))?

EDIT:

phiên bản java "1.6.0_29"

Java (TM) SE Runtime Environment (xây dựng 1.6.0_29-b11)

Java HotSpot (TM) Khách hàng VM (xây dựng 20,4-b02, chế độ hỗn hợp, chia sẻ)

Hệ điều hành: Windows 7 Enterprise-32 bit

+0

Tôi không thấy tăng. Bộ nhớ tăng lên, sau đó thu thập xuống.Dường như bộ nhớ tối đa được sử dụng không đổi theo thời gian. –

+0

Tuy nhiên, một công cụ khác để thử tìm rò rỉ bộ nhớ trong ứng dụng của bạn là [Plumbr] (http://plumbr.eu). Nó sẽ dễ dàng hơn nhiều so với đấu vật với profilers và cố gắng suy ra một cái gì đó từ tất cả các thông tin đó. – Nikem

Trả lời

10

Tại sao vẫn có mẫu răng cưa?

Nếu tôi không nhầm, một phần lý do cho điều này là chính màn hình đang buộc ứng dụng tạo đối tượng tạm thời chứa thông tin về trạng thái thu gom rác và sử dụng bộ nhớ.

Tại sao khi GC chạy không lưu tất cả bộ nhớ (mỗi lần gc chạy (các thung lũng) bộ nhớ đã sử dụng tăng 10-20Kb (so với thung lũng trước))?

Tôi tin rằng màn hình không thấy ngay bộ nhớ đã sử dụng sau khi thu gom rác, mà đúng hơn, phải thăm dò thường xuyên để xem mức sử dụng bộ nhớ. Do đó, "thung lũng" nhận thức nhất thiết phải cao hơn một chút so với thung lũng thực sự. Tôi sẽ đoán rằng việc tăng mức sử dụng bộ nhớ ở các thung lũng chỉ là một tạo tác ngẫu nhiên cho sự khác biệt này và sẽ được trung hòa theo thời gian. (Tức là, tôi không nghĩ rằng thực tế có 10-20 KB rò rỉ bộ nhớ xảy ra trong mỗi chu kỳ.)

+0

Vậy làm cách nào để tôi có được bức tranh chính xác hơn về những gì đang xảy ra dưới mui xe? – GoldfishGrenade

+0

Trong một chương trình thực sự, hoặc trong chương trình thử nghiệm không có vòng lặp-while-loop của bạn? Trong một chương trình thực sự, một bãi chứa sẽ giúp bạn tìm ra loại đối tượng nào không bị thu gom rác, điều này có thể giúp bạn tìm ra phần nào của chương trình có thể đổ lỗi. – ruakh

+0

+1 Điều này hoàn toàn gây ra bởi các bean quản lý và bất kỳ giao thức nào được sử dụng để nói chuyện với chúng (có thể là RMI vì nó là mặc định). – Fredrik

4

Đây là một tạo tác bởi profiler, mà không có profiler sẽ không có phân bổ. Các trình tạo khác nhau tạo ra các tạo phẩm khác nhau, tùy thuộc vào cách chúng ghi lại dữ liệu. Dưới đây bạn thấy những gì profiling Nothing JProfiler sẽ trông giống như:

enter image description here

Ít hơn nhiều của một mô hình răng cưa. Tuy nhiên, đó cũng là một tiêu thụ bộ nhớ nhỏ xíu:

enter image description here

đó là do thực tế các cuộc thăm dò đại lý hồ sơ đậu java.lang.management.MemoryUsage JMX. Cuối cùng tiêu thụ này cũng sẽ kích hoạt một bộ sưu tập rác.

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