Nó có thể giúp làm sáng tỏ những gì nền tảng của GC bạn đang hỏi về - JVM, CLR, Lisp, vv Điều đó nói rằng:
Đầu tiên để lùi lại một bước, các biến địa phương nhất định thường được phân bổ trên ngăn xếp. Tuy nhiên, các chi tiết cụ thể có thể khác nhau tùy theo ngôn ngữ. Để lấy C# làm ví dụ, chỉ có các thông số Value Types cục bộ và được lưu trữ trên ngăn xếp. Vì vậy, trong C#, foo
sẽ được cấp phát trên stack:
public function bar() {
int foo = 2;
...
}
Ngoài ra, các biến được cấp phát động sử dụng bộ nhớ từ đống. Điều này nên trực giác có ý nghĩa, nếu không thì ngăn xếp sẽ phải phát triển năng động mỗi khi một số new
được gọi. Ngoài ra, nó sẽ có nghĩa là các biến như vậy chỉ có thể được sử dụng như là người dân địa phương trong hàm cục bộ đã phân bổ chúng, tất nhiên là không đúng bởi vì chúng ta có thể có (ví dụ) các biến thành viên lớp. Vì vậy, để lấy một ví dụ khác từ C#, trong trường hợp sau đây result
được cấp phát trên heap:
public class MyInt
{
public int MyValue;
}
...
MyInt result = new MyInt();
result.MyValue = foo + 40;
...
Bây giờ với nền ý nghĩ đó, bộ nhớ trên đống là thu gom rác. Bộ nhớ trên ngăn xếp không cần GC vì bộ nhớ sẽ được phục hồi khi hàm hiện tại trả về. Ở cấp độ cao, thuật toán GC hoạt động bằng cách theo dõi tất cả các đối tượng được phân bổ động trên heap. Sau khi được phân bổ qua new
, đối tượng sẽ được theo dõi bởi GC và được thu thập khi đối tượng không còn trong phạm vi và không có thêm tham chiếu đến đối tượng đó.
Nguồn
2010-02-28 03:47:36
Bạn có hỏi về một nhà sưu tập nền tảng/thu gom rác cụ thể không? Vui lòng chỉnh sửa thẻ và/hoặc câu hỏi của bạn để cụ thể hơn. – Jay
Điều đó nói chung ... Nói về tham chiếu đến liên kết wikipedia: http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29 –