2011-10-04 24 views
6

Tôi phải thừa nhận rằng các phương pháp sau đây không bị rò rỉ bộ nhớ:Java Memory Phân Xì

public final void setData(final Integer p_iData) 
{ 
    data = p_iData; 
} 

đâu data là một tài sản của một số lớp.

Mỗi khi phương thức được gọi, new Integer sẽ thay thế tham chiếu hiện tại data. Vậy điều gì đang xảy ra với dữ liệu hiện tại/cũ?

Java phải làm điều gì đó dưới mui xe; nếu không chúng ta sẽ phải loại bỏ bất kỳ đối tượng nào mỗi khi một đối tượng được gán.

+0

Đúng, nó được gọi là [BigBadGarbageCollector] (http://en.wikipedia.org/wiki/Garbage_collection_ (computer_science)). –

+0

Java hỗ trợ GC tự động. Xem ở đây để xem mã mẫu demo: http://www.herongyang.com/Computer-History/Java-Support-Automatic-Garbage-Collection.html –

Trả lời

7

Đơn giản giải thích:

Định kỳ thu gom rác nhìn vào tất cả các đối tượng trong hệ thống, và nhìn thấy mà không thể truy cập bất kỳ hơn từ tài liệu tham khảo trực tiếp. Nó giải phóng bất kỳ đối tượng nào không thể truy cập được nữa.

Lưu ý rằng phương pháp của bạn không không tạo đối tượng Integer mới. Một tham chiếu đến cùng một đối tượng Integer có thể được truyền lại theo thời gian và một lần nữa, ví dụ.

Thực trạng thu gom rác thải là rất nhiều phức tạp hơn này:

  • Modern tổng công ty có xu hướng thế hệ, giả định rằng hầu hết các đối tượng là ngắn ngủi, vì vậy nó không cần phải kiểm tra toàn bộ (có thể lớn) đống như thường lệ; nó chỉ có thể kiểm tra các đối tượng "gần đây" cho sự sống động thường xuyên
  • Đối tượng có thể có trình hoàn thành - mã sẽ chạy trước khi chúng được thu thập rác. Đây trì hoãn thu gom rác thải của các đối tượng như vậy bởi một chu kỳ, và đối tượng thậm chí có thể "hồi sinh" bản thân bằng cách làm cho bản thân có thể truy cập
  • tổng công ty hiện đại có thể thu thập song song, và có nhiều tùy chọn tinh chỉnh
0

Cuối cùng, dữ liệu được thu thập rác.

3

Java là ngôn ngữ được thu thập rác.

Khi không có tham chiếu trực tiếp nào cho đối tượng, nó trở nên đủ điều kiện để thu thập rác. Bộ thu chạy theo thời gian và sẽ lấy lại bộ nhớ của đối tượng.

Tóm lại, mã của bạn chính xác 100% và không bị rò rỉ bộ nhớ.

+1

+1 - Câu trả lời đơn giản, đầy đủ. –

0

nếu không có ther tham chiếu đến data, các bộ thu rác của java sẽ làm sạch dữ liệu cũ lên và giải phóng bộ nhớ

0

Trên thực tế, kể từ khi Integer là một đối tượng không phải là một loại nguyên thủy, dòng:

data = p_iData; 

đang cập nhật một tham chiếu.

Hiện tại, đối tượng cũ this.data được sử dụng để trỏ tới sẽ được GC kiểm tra để xác định xem không có tham chiếu nào khác cho đối tượng đó.Nếu không, đối tượng đó bị hủy và bộ nhớ được giải phóng (sau này một thời gian)

0

Nếu đối tượng được tham chiếu trước đó bởi dữ liệu không còn được tham chiếu bởi bất kỳ cấu trúc đối tượng nào được tham chiếu từ bất kỳ chuỗi chạy nào. . GC được thực hiện bởi Java ở chế độ nền để giải phóng bộ nhớ của các đối tượng không sử dụng.

0

tôi muốn hiển thị một ví dụ để bạn ở một số mã:

int x; 
x=10; 
x=20; 

ban đầu tôi được phân công x 10 lại x 20 nhớ tham khảo đầu tiên sẽ được xử lý bằng công nghệ Java GC. Java GC là một chuỗi tht chạy liên tục và kiểm tra bộ nhớ không bị nhiễu và làm sạch nó.

+1

Không hoàn toàn vì 'int' là kiểu nguyên thủy và thậm chí nếu bạn chọn' Integer x; 'thay thế và để các dòng sau sử dụng autoboxing thành Integer không có gì sẽ được làm sạch vì' Integer.valueOf (int i) 'sử dụng' Integer ' 'trường hợp cho tất cả các giá trị giữa -128 và 127 không bao giờ được GC. Ít nhất là trong việc thực hiện Java chuẩn. – Gandalf