Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Làm thế nào để xác định các bộ nhớ rò rỉ trong thời gian chạy ngôn ngữ phổ biến

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:318263
TÓM TẮT
Bài viết này thảo luận về những gì bộ nhớ rò rỉ là và danh sách một số có thể nguyên nhân của rò rỉ bộ nhớ. Thêm vào đó, bài viết này thảo luận về các rò rỉ bộ nhớ nhận thức và làm thế nào nó có thể được misinterpreted là một rò rỉ bộ nhớ đúng sự thật.
THÔNG TIN THÊM
Rò rỉ bộ nhớ có thể gây ra một ứng dụng chạy ra khỏi tài nguyên và có thể gây ra một ứng dụng sụp đổ. Nó là quan trọng để xác định rò rỉ bộ nhớ. Vấn đề rò rỉ bộ nhớ đã cản các nhà phát triển bằng C/C++ trong nhiều năm. Microsoft Visual Studio 2005 hoặc trong Microsoft Visual Studio.NET, một bộ sưu tập toàn diện rác gói phần mềm và quản lý bộ nhớ có thể ngăn chặn rò rỉ bộ nhớ, nhưng theo một số những trường hợp, một chương trình có thể xuất hiện để rò rỉ bộ nhớ.

Định nghĩa của rò rỉ bộ nhớ

Một rò rỉ bộ nhớ xảy ra khi bộ nhớ được cấp phát trong một chương trình và là không bao giờ quay trở lại hệ điều hành, mặc dù chương trình không sử dụng bộ nhớ lâu hơn nữa. Sau đây là bốn loại cơ bản của rò rỉ bộ nhớ:
  • Trong một môi trường tự quản lý bộ nhớ: bộ nhớ là tự động được phân bổ và tham chiếu bởi một con trỏ. Con trỏ là bị xóa trước khi bộ nhớ giải phóng. Sau khi con trỏ là bị xóa, bộ nhớ có thể không còn truy cập và do đó không thể được giải phóng.
  • Trong một môi trường năng động quản lý bộ nhớ: bộ nhớ là xử lý nhưng không bao giờ thu thập được, bởi vì một tham chiếu đến các đối tượng vẫn còn hoạt động. Bởi vì một tham chiếu đến các đối tượng vẫn đang hoạt động, thùng rác Trình sưu tập không bao giờ thu thập các bộ nhớ điều đó. Điều này có thể xảy ra với một tham chiếu là thiết lập của hệ thống hoặc chương trình.
  • Trong một môi trường năng động quản lý bộ nhớ: thùng rác Trình sưu tập có thể thu thập và miễn phí bộ nhớ nhưng không bao giờ trả nó đến các hoạt động hệ thống. Điều này xảy ra khi các bộ thu rác không thể di chuyển các đối tượng được còn sử dụng một phần của bộ nhớ và miễn phí phần còn lại.
  • Trong bất kỳ môi trường bộ nhớ: quản lý bộ nhớ nghèo có thể kết quả khi nhiều lớn các đối tượng được khai báo và không bao giờ được phép rời khỏi phạm vi. Kết quả là, bộ nhớ được sử dụng và không bao giờ giải thoát.

Thảo luận

Vì của gói bộ sưu tập rác, được thực hiện trong Microsoft.NET Framework, nó là không thể có một rò rỉ bộ nhớ trong quản lý mã. Điều này cho thấy hai câu hỏi: làm thế nào sau đó có thể xảy ra một rò rỉ bộ nhớ? Tại sao nó xuất hiện rằng bạn có một rò rỉ bộ nhớ?

Một rò rỉ bộ nhớ có thể xảy ra trong một.NET Framework ứng dụng khi bạn sử dụng không được quản lý mã như một phần của các ứng dụng. Mã không được quản lý này có thể rò rỉ bộ nhớ, và các.NET Framework thời gian chạy không thể giải quyết vấn đề đó.

Ngoài ra, một dự án có thể chỉ xuất hiện để có một rò rỉ bộ nhớ. Tình trạng này có thể xảy ra nếu nhiều lớn các đối tượng (ví dụ như DataTable các đối tượng) được khai báo và sau đó thêm vào một bộ sưu tập (chẳng hạn như một Số liệu). Các nguồn tài nguyên mà các đối tượng này sở hữu không bao giờ có thể được phát hành, và các nguồn tài nguyên là trái còn sống cho toàn bộ chạy chương trình. Điều này dường như là một rò rỉ, nhưng trên thực tế nó là chỉ là một triệu chứng của đường bộ nhớ này đang phân bổ trong chương trình.

Ví dụ, bạn có một Số liệu. Mỗi khi một truy vấn mới được điều hành, bạn thêm một mới DataTable yếu tố đó Số liệu tổ chức các dữ liệu được trả lại. Nếu có một lượng lớn dữ liệu mà bạn không bao giờ vứt bỏ, dữ liệu vẫn còn sống miễn là các Số liệu vẫn còn dùng. Nếu điều này xảy ra lần đủ, có thể chạy ra khỏi bộ nhớ. Đây không phải là một rò rỉ bộ nhớ, nhưng thay vào đó nó là một vấn đề trong việc quản lý bộ nhớ. Xem ví dụ mã sau:
  Dim DS As DataSet  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")  cn.Open()   Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)  Dim i As Integer  DS = New DataSet()  For i = 0 To 1000      da.Fill(DS, "Table" + i.ToString)  Next				
Chú ý Ví dụ này là chỉ một đoạn mã. Ví dụ này giả định rằng Microsoft SQL Server được cài đặt trên máy tính địa phương và rằng người sử dụng những người đang chạy mã này đã truy cập vào các Northwind cơ sở dữ liệu được bao gồm với SQL Server.

Mặc dù mã này là rõ ràng là không hiệu quả và không thực tế, nó có nghĩa là để chứng minh rằng nếu các đối tượng được thêm vào một bộ sưu tập (chẳng hạn như việc thêm các các bảng để các Số liệu bộ sưu tập), các đối tượng được lưu giữ hoạt động khi các bộ sưu tập vẫn còn sống. Nếu một bộ sưu tập được tuyên bố ở cấp độ toàn cầu của chương trình và các đối tượng được khai báo trong suốt chương trình và thêm vào đó bộ sưu tập, điều này nghĩa là ngay cả khi các đối tượng không còn trong phạm vi, các các đối tượng vẫn còn sống, vì họ vẫn còn đang được tham chiếu.

Mỗi thời gian mà điều này xảy ra, số lượng bộ nhớ chương trình đang sử dụng tăng. Bộ nhớ không giảm cho đến khi kết thúc chương trình hoặc các phát hành của các đối tượng từ bộ sưu tập. Khi bạn xem các chương trình trên một theo dõi hiệu suất, điều này dường như là một rò rỉ bộ nhớ, nhưng nó không phải là. Các chương trình vẫn kiểm soát bộ nhớ, nhưng đã chọn không để phát hành nó. Các thực tế là các chương trình vẫn có quyền kiểm soát ngăn ngừa điều này bị rò rỉ bộ nhớ, nhưng thực tế rằng chương trình giữ ngày càng tăng số lượng bộ nhớ được sử dụng có thể làm cho nó xuất hiện như một rò rỉ bộ nhớ.

Trong số các triệu chứng rò rỉ bộ nhớ

Khi số lượng bộ nhớ một chương trình đang sử dụng tiếp tục tăng trong thời gian thực hiện, đây là một triệu chứng của một rò rỉ bộ nhớ. (Bạn có thể xem này tính của bộ nhớ thông qua một màn hình hiệu năng.) Số lượng bộ nhớ chương trình sử dụng cuối cùng có thể gây ra các chương trình để chạy ra khỏi tài nguyên và sụp đổ.
THAM KHẢO
Border|phải|200px Đây là danh sách các chủ điểm trợ giúp để biết thêm về bộ nhớ và quản lý:
  • Lớp học GC
  • Bộ nhớ hiệu suất Counters
  • Quản lý bộ nhớ tự động
  • Interoperating với không được quản lý mã
Để biết thêm thông tin, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức Microsoft:
317297Lộ trình gỡ lỗi treo cứng, rò rỉ bộ nhớ, deadlocks, và điều kiện chủng tộc trong Visual Basic.NET
Để biết thêm chi tiết, hãy truy cập Microsoft sau đây Các trang Web của nhà phát triển mạng (MSDN):
CLR

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 318263 - Xem lại Lần cuối: 08/27/2011 18:12:00 - Bản sửa đổi: 2.0

Microsoft Visual Studio 2005 Standard Edition, Microsoft Visual Studio 2005 Professional Edition, Microsoft Visual Studio .NET 2003 Professional Edition, Microsoft Visual Studio .NET 2003 Enterprise Architect, Microsoft Visual Studio .NET 2003 Enterprise Developer, Microsoft Visual Studio .NET 2003 Academic Edition, Microsoft Visual Studio .NET 2002 Professional Edition, Microsoft Visual Studio .NET 2002 Enterprise Architect, Microsoft Visual Studio .NET 2002 Enterprise Developer, Microsoft Visual Studio .NET 2002 Academic Edition, Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbvs2005swept kbvs2005applies kbinfo kbmt KB318263 KbMtvi
Phản hồi