Cây rơm
Đây stack
là một khối bộ nhớ để lưu trữ local variables
và parameters
. Ngăn xếp phát triển và thu hẹp một cách hợp lý khi một hàm được nhập và thoát.
Hãy xem xét phương pháp sau:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
Phương thức này là đệ quy, nghĩa là nó gọi chính nó. Mỗi khi phương thức được nhập, một int mới sẽ được cấp phát trên ngăn xếp và mỗi khi phương thức thoát ra, int sẽ được phân bổ .
Đống
- Heap là một khối bộ nhớ trong đó
objects
(tức là reference-type instances
) cư trú. Bất cứ khi nào một đối tượng mới được tạo, nó sẽ được cấp phát trên heap và một tham chiếu đến đối tượng đó được trả về. Trong quá trình thực thi chương trình, heap bắt đầu lấp đầy khi các đối tượng mới được tạo. Thời gian chạy có bộ thu gom rác định kỳ xử lý các đối tượng từ đống, vì vậy chương trình của bạn không chạy Out Of Memory
. Một đối tượng đủ điều kiện để phân bổ giao dịch ngay khi nó không được tham chiếu bởi bất kỳ thứ gì đó chính nó alive
.
- Đống cũng lưu trữ
static fields
. Không giống như các đối tượng được phân bổ trên heap (có thể được thu thập rác) , these live until the application domain is torn down
.
Hãy xem xét phương pháp sau:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
Trong ví dụ trên, chúng ta bắt đầu bằng cách tạo một đối tượng StringBuilder được tham chiếu bởi biến ref1, và sau đó viết ra nội dung của nó. Đối tượng StringBuilder đó ngay lập tức đủ điều kiện để thu gom rác, vì sau đó không có gì sử dụng nó. Sau đó, chúng tôi tạo một StringBuilder khác được tham chiếu bởi biến ref2 và sao chép tham chiếu đó vào ref3. Mặc dù ref2 không được sử dụng sau thời điểm đó, ref3 vẫn giữ nguyên đối tượng StringBuilder giống nhau — đảm bảo rằng nó không đủ điều kiện để thu thập cho đến khi chúng ta sử dụng xong ref3.
Các cá thể kiểu giá trị (và các tham chiếu đối tượng) sống ở bất cứ nơi nào biến được khai báo. Nếu cá thể được khai báo dưới dạng một trường trong một kiểu lớp hoặc dưới dạng một phần tử mảng, thì cá thể đó sống trên heap.