2010-03-03 32 views
6

Bộ sưu tập rác được gọi tự động khi đối tượng được tham chiếu đến không còn có sẵn cho bất kỳ biến nào. Nhưng tôi thích biết tại sao chúng ta gọi một cách rõ ràng bằng cách sử dụng System.gc() khi thu gom rác được gọi tự động. Khi nào chúng ta gọi System.gc();liên quan đến việc thu thập rác. Tại sao chúng ta cần gọi System.gc() ;?

+0

Bạn không bao giờ nên gọi System.gc(). Tại sao bạn nghĩ rằng bạn cần phải gọi nó? –

Trả lời

6

Chúng tôi không.

Chúng tôi không làm như vậy.

Có lẽ kinh nghiệm của tôi bị giới hạn, nhưng tôi có không một lần thấy cần thiết để gọi System.gc().

Tôi sẽ trích dẫn Brian Goetz trên khía cạnh hiệu suất (nếu bạn chưa nghe nói về anh ấy, nhìn anh ta lên - và đọc phần còn lại của bài viết này, quá):

Một loại thứ ba mà các nhà phát triển thường nhầm lẫn nghĩ rằng họ đang giúp các nhà sưu tập rác là việc sử dụng System.gc(), mà gây ra một bộ sưu tập rác (thực sự, nó chỉ cho thấy rằng đây có thể là một thời điểm tốt cho một bộ sưu tập rác). Thật không may, System.gc() kích hoạt một bộ sưu tập đầy đủ, trong đó bao gồm truy tìm tất cả các đối tượng sống trong heap và quét và nén các thế hệ cũ. Điều này có thể là rất nhiều công việc.

Nói chung, tốt hơn là để hệ thống quyết định khi nào cần thu thập đống và có hay không thực hiện bộ sưu tập đầy đủ.

10

Bạn không. Như bạn nói, thu gom rác là tự động. System.gc() thậm chí không ép buộc một bộ sưu tập rác; nó chỉ đơn giản là một gợi ý cho JVM rằng "bây giờ có thể là thời điểm tốt để dọn dẹp một chút"

Nói chung, cố gắng buộc bộ thu gom rác thực hiện những gì bạn muốn với System.gc() là một hack được áp dụng bởi những người nghĩ rằng họ biết rõ hơn họ thực sự làm, hoặc như là một (cố gắng) workaround cho mã bị hỏng.

Tôi đã viết Java trong nhiều năm và tôi chưa thấy một tình huống mà gọi System.gc thực sự là điều đúng đắn nên làm (trong bất cứ điều gì tôi đã viết)

+0

Tôi đã nhìn thấy mã thiếu sót thực sự chạy chậm hơn với System.gc(), bởi các nhà phát triển nghĩ rằng họ biết rõ hơn. –

+0

Một số triển khai của JVM (chủ yếu cho phần cứng nhúng/phần mềm thấp) hứa hẹn sẽ thu thập rác khi System.gc() được gọi. Tuy nhiên bạn không bao giờ cần điều này. – Thirler

+0

Nhiều thuật toán thu thập rác làm gián đoạn chương trình của bạn, chặn thực thi trên tất cả các chuỗi cho đến khi quá trình gặt được hoàn thành. Việc gọi 'System.gc()' quá thường xuyên sẽ làm tổn thương nghiêm trọng hiệu suất và (hầu như) luôn không cần thiết. – Matthew

1

Bạn không cần nó. Hãy suy nghĩ về nó như một công cụ chẩn đoán, giống như có thể ghi vào một bàn điều khiển gỡ lỗi.

Ví dụ: hãy tưởng tượng rằng nếu bạn đang làm điểm chuẩn, bạn sẽ muốn yêu cầu GC thu thập rác sau mỗi lần chạy điểm chuẩn.

1

Bạn do cần. Nó rất hữu ích cho dù những người khác nói gì.

Ví dụ sử dụng: Giả sử bạn vừa hoàn thành tác vụ nền dài đã sử dụng nhiều bộ nhớ. Không ai trong số các đối tượng đó sẽ được sử dụng lại. Vì nhiệm vụ mất nhiều thời gian nên người dùng sẽ không quan tâm đến khoảng 5-10 giây nữa. này là thời điểm thích hợp để thu thập rác.

Nếu bạn không GC tại thời điểm đó, nó sẽ xảy ra sau đó. Có lẽ trong quá trình sử dụng tương tác của chương trình tại thời điểm đó trải nghiệm người dùng bị thay đổi.

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