Tôi gặp vấn đề trong đó một mảng 3 chiều phân bổ một lượng lớn bộ nhớ và đôi khi chương trình cần thay thế chúng bằng những cái lớn hơn và nhỏ hơn và ném ra một OutOfMemoryException.Buộc thu gom rác của mảng, C#
Ví dụ: có 5 mảng được phân bổ 96MB (200x200x200, 12 byte dữ liệu trong mỗi mục nhập) và chương trình cần thay thế chúng bằng 210x210x210 (111MB). Nó thực hiện theo cách tương tự như sau:
array1 = new Vector3[210,210,210];
Trường hợp array1-array5 là các trường tương tự được sử dụng trước đó. Điều này sẽ thiết lập các mảng cũ như các ứng cử viên cho việc thu gom rác nhưng dường như GC không hành động đủ nhanh và để lại các mảng cũ được phân bổ trước khi cấp phát các mảng mới - điều này gây ra OOM - trong khi nếu chúng được giải phóng trước khi phân bổ mới thì không gian đủ.
Những gì tôi đang tìm kiếm là một cách để làm điều gì đó như thế này:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
Tôi không chắc chắn nếu một collecion rác đầy đủ sẽ là một ý tưởng tốt kể từ khi mã mà có thể (trong một số trường hợp) cần được thực hiện khá thường xuyên.
Có cách nào phù hợp để thực hiện việc này không?
Dường như thật kỳ lạ là điều này sẽ gây ra ngoại lệ OOM. Bạn có một số mã mẫu thể hiện sự cố không? – aquinas
Đây là một phần của một chương trình hợp lý (vẫn chưa được phát hành) và không may, tôi chỉ có thể đăng các đoạn mã nhỏ của mã thực tế, không có gì đủ lớn để có thể kết hợp được. –
Vấn đề của bạn không phải là quản lý bộ nhớ, nhưng bạn đang sử dụng các mảng quá lớn. Tại sao bạn nghĩ rằng bạn cần những mảng lớn ở nơi đầu tiên? Bạn đang sử dụng chúng để làm gì? – Guffa