Đây là danh sách các câu hỏi đại diện cho các vấn đề mọi người thường gặp phải với quản lý bộ nhớ. Một số câu trả lời xuất hiện bên dưới, với các liên kết đến tài liệu hỗ trợ hữu ích, chẳng hạn như , the và các trang web bên ngoài. Để có giải thích đầy đủ về bất kỳ thuật ngữ nào được sử dụng, hãy xem bảng thuật ngữ Show
Điều khoản khácTại sao đĩa của tôi rattle rất nhiều?Khi bạn đang sử dụng một hệ thống, máy tính có thể phải tìm nạp bộ nhớ từ đĩa trước khi có thể truy cập chúng. Nếu tổng số chương trình đang hoạt động của bạn vượt quá khả dụng, sẽ xảy ra liên tục, đĩa của bạn sẽ kêu lạch cạch và hiệu suất sẽ giảm đáng kể. Các giải pháp duy nhất là cài đặt thêm bộ nhớ vật lý, chạy ít chương trình hơn cùng một lúc hoặc điều chỉnh các yêu cầu bộ nhớ cho chương trình của bạn Vấn đề trở nên trầm trọng hơn vì các hệ thống bộ nhớ ảo xấp xỉ bộ làm việc lý thuyết với tập hợp các trang mà bộ làm việc nằm trên đó. Nếu tập hợp làm việc thực tế được trải ra trên một số lượng lớn các trang, thì tập hợp trang làm việc đó là lớn Khi các đối tượng đề cập đến nhau ở xa trong bộ nhớ, điều này được gọi là kém. Điều này xảy ra do người thiết kế chương trình không lo lắng về điều này hoặc trình quản lý bộ nhớ được sử dụng trong chương trình không cho phép người thiết kế làm bất cứ điều gì về nó Lưu ý rằng có thể tự động tổ chức dữ liệu của bạn theo các mẫu tham chiếu của chương trình và do đó giảm thiểu sự cố này Tôi có thể tìm hiểu thêm về thu gom rác ở đâu?Nhiều ngôn ngữ hiện đại đã được tích hợp sẵn và tài liệu ngôn ngữ sẽ cung cấp chi tiết. Đối với một số ngôn ngữ khác, có thể thêm bộ sưu tập rác, chẳng hạn như thông qua Hệ thống nhóm bộ nhớ hoặc bộ sưu tập Boehm–Demers–Weiser Tôi có thể lấy một bộ thu gom rác ở đâu?Memory Pool System và Boehm–Demers–Weiser Collector phù hợp với C hoặc C++. Tuy nhiên, cách tốt nhất để có được bộ thu gom rác là lập trình bằng ngôn ngữ cung cấp bộ thu gom rác nguyên bản Tại sao chương trình của tôi sử dụng quá nhiều bộ nhớ?Nếu bạn đang sử dụng (ví dụ: và trong ), có khả năng chương trình của bạn không thể giải phóng các khối bộ nhớ sau khi ngừng sử dụng chúng. Khi mã của bạn phân bổ bộ nhớ trên heap, có nghĩa vụ phải giải phóng bộ nhớ đó. Nếu một chức năng sử dụng bộ nhớ heap để trả về dữ liệu, bạn phải quyết định ai đảm nhận trách nhiệm đó. Đặc biệt chú ý đến giao diện giữa các chức năng và mô-đun. Hãy nhớ kiểm tra điều gì xảy ra với bộ nhớ được cấp phát trong trường hợp có lỗi hoặc ngoại lệ Nếu bạn đang sử dụng (gần như chắc chắn), có thể mã của bạn đang ghi nhớ một số khối mà nó sẽ không bao giờ sử dụng trong tương lai. Điều này được gọi là sự khác biệt giữa và. Cân nhắc xóa các biến liên quan đến khối lớn hoặc mạng khối, khi cấu trúc dữ liệu không còn cần thiết Tôi sử dụng thư viện và chương trình của tôi phát triển mỗi khi tôi gọi nó. Tại sao?Nếu bạn đang sử dụng , có khả năng thư viện đang phân bổ cấu trúc dữ liệu trên heap mỗi khi nó được sử dụng, nhưng chúng không được giải phóng. Kiểm tra tài liệu giao diện cho thư viện; . Có thể cần phải đóng thư viện và khởi tạo lại nó để khôi phục bộ nhớ đã cấp phát Thật không may, rất có thể thư viện có lỗi quản lý bộ nhớ. Trong trường hợp này, trừ khi bạn có mã nguồn, bạn không thể làm gì khác ngoài việc báo cáo sự cố cho nhà cung cấp. Có thể thêm trình thu gom rác vào ngôn ngữ của bạn và điều này có thể giải quyết vấn đề của bạn Với một , đôi khi các đối tượng được giữ lại vì có một tham chiếu đến chúng từ một số cấu trúc dữ liệu toàn cầu. Mặc dù thư viện có thể không sử dụng thêm các đối tượng, nhưng người thu thập phải giữ lại các đối tượng vì chúng vẫn còn. Nếu bạn biết rằng một tham chiếu cụ thể sẽ không bao giờ được sử dụng trong tương lai, bạn có thể ghi đè lên nó. Điều này có nghĩa là trình thu thập sẽ không giữ lại đối tượng được giới thiệu vì tham chiếu đó. Các tham chiếu khác đến cùng một đối tượng sẽ giữ nó, vì vậy chương trình của bạn không cần phải xác định liệu chính đối tượng đó có bao giờ được truy cập trong tương lai hay không. Điều này nên được thực hiện một cách thận trọng, sử dụng các công cụ của trình thu gom rác để tìm đối tượng nào đang được giữ lại và tại sao Nếu bộ thu gom rác của bạn là , có thể bạn đang mắc phải , điều này thường có thể được giải quyết bằng cách điều chỉnh bộ thu gom hoặc sử dụng một vùng bộ nhớ riêng cho thư viện Tại sao tôi không thể chỉ sử dụng dữ liệu cục bộ trên ngăn xếp hoặc trong các biến toàn cục?Dữ liệu toàn cầu hoặc tĩnh có kích thước cố định; . Dữ liệu được cấp phát theo ngăn xếp không tồn tại khi bạn rời khỏi hàm (hoặc khối chương trình) mà nó được khai báo Nếu các yêu cầu bộ nhớ của chương trình của bạn hoàn toàn có thể dự đoán được và cố định tại thời điểm biên dịch hoặc bạn có thể cấu trúc chương trình của mình để chỉ dựa vào dữ liệu ngăn xếp khi nó tồn tại, thì bạn hoàn toàn có thể tránh sử dụng cấp phát heap. Lưu ý rằng, với một số trình biên dịch, việc sử dụng các khối bộ nhớ chung lớn có thể làm tăng kích thước tệp đối tượng Việc phân bổ một khối toàn cầu có vẻ “có thể đủ lớn” cho bất kỳ tập hợp dữ liệu hợp lý nào thường có vẻ đơn giản hơn, nhưng sự đơn giản hóa này gần như chắc chắn sớm muộn sẽ gây ra rắc rối Tại sao tôi phải lo lắng về bộ nhớ ảo?Mặc dù có thể tăng đáng kể khả năng lưu trữ dữ liệu của bạn, nhưng có ba vấn đề thường gặp phải với nó
|