2013-02-09 23 views
6

Tôi đã thực hiện một số nghiên cứu về bộ thu gom rác java và hiểu rằng một đối tượng không còn được tham chiếu sẽ/nên được xử lý bởi bộ thu gom rác. Về mảng các đối tượng, tôi biết rằng việc gán một đối tượng mới cho một vị trí trong mảng không xử lý đúng cách đối tượng được phân bổ trước đó.Đối tượng Dereferencing trong một mảng cho Bộ sưu tập rác Java

  1. Tôi muốn biết cách loại bỏ và xử lý đúng đối tượng từ một mảng tại vị trí x và gán một đối tượng mới cho cùng một mảng tại vị trí x.
  2. Tôi cũng muốn biết cách xử lý chính xác mảng đó.

Trả lời

9

Thiết lập một đối tượng trong một mảng để null hoặc các đối tượng khác làm cho nó đủ điều kiện để thu gom rác thải, giả định rằng không có tham chiếu đến cùng một đối tượng được lưu trữ ở bất cứ đâu.

Vì vậy, nếu bạn có

Object[] array = new Object[5]; 
Object object = new Object() // 1 reference 
array[3] = object; // 2 references 
array[1] = object; // 3 references 


object = null; // 2 references 
array[1] = null; // 1 references 
array[3] = new Object(); // 0 references -> eligible for garbage collection 

array = null; // now even the array is eligible for garbage collection 
// all the objects stored are eligible too at this point if they're not 
// referenced anywhere else 

Bộ sưu tập rác hiếm khi sẽ đòi lại ký ức của người dân địa phương mặc dù, vì vậy thu gom rác thải chủ yếu sẽ xảy ra đã ngoài phạm vi của hàm.

+2

Câu trả lời hay. Việc vô hiệu hóa bất kỳ đối tượng nào loại bỏ tham chiếu đến một đối tượng và làm cho nó trở thành một ứng cử viên cho việc thu thập rác. +1 – yams

0

Tất cả các đối tượng sẽ được thu thập tự động bởi bộ thu gom rác khi chúng không còn được tham chiếu nữa. Bạn không cần phải lo lắng về nó. Tuy nhiên nếu bạn muốn bạn có thể gán null cho mảng và trên lần chạy tiếp theo của GC, bộ nhớ được phân bổ cho mảng sẽ được deallocated chính nó. Để chạy GC một cách rõ ràng, bạn có thể làm

java.lang.Runtime.getRuntime().gc(); 
+3

Bạn không nên gọi trình thu gom rác một cách rõ ràng trừ khi bạn có lý do rất tốt. Và chúng khá hiếm. –

+3

Ví dụ về "lý do rất tốt" là gì? –

1

Trong java bạn không cần phải rõ ràng deallocate đối tượng, bất kể cho dù họ là tài liệu tham khảo từ mảng, hoặc trường đơn giản hoặc biến. Một khi đối tượng không thể truy cập mạnh từ bộ gốc, bộ sưu tập rác sẽ giải quyết nó sớm hay muộn. Và thường là không hợp lý khi cố gắng giúp GC thực hiện công việc của mình. Đọc số article để biết thêm chi tiết.

0

Phân bổ đối tượng phải xảy ra khi đóng hoặc mở bằng cách hủy bỏ đối tượng. Các kiểm tra JUnit làm khẳng địnhGC trên các đối tượng để đảm bảo tất cả các đối tượng đã được thu thập rác. Java sẽ không thu thập rác nếu một mục có tham chiếu. Tôi thực sự khuyên bạn nên làm thử nghiệm JUnit.

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