2013-03-30 36 views
8

Tôi có some code đang hoạt động, tuy nhiên nó có rò rỉ bộ nhớ trong đó.Phát hiện rò rỉ bộ nhớ node.js/javascript trong mã

Một số chiến lược tốt để theo dõi rò rỉ bộ nhớ trong node.js là gì?

Tôi nên làm theo các bước nào khi tìm kiếm các rò rỉ như vậy?

Tôi làm cách nào để theo dõi rò rỉ trong mã của mình?

Cảm ơn

Trả lời

17

Bạn có thể tìm hiểu điều này bằng cách sử dụng bộ nhớ của ứng dụng.

Đối tượng Javascript được phân bổ trên heap, vì vậy bạn sẽ muốn có một công cụ có thể đổ đống. Sau khi có được một bãi chứa đống, bạn có thể kiểm tra nó và xem có bao nhiêu thể hiện của một đối tượng (hoặc hàm) đã tồn tại.

Ví dụ: đối với mã của bạn, bạn biết bạn tạo ổ cắm bất cứ khi nào người dùng kết nối. Dumping đống trong khi ba người dùng được kết nối sẽ hiển thị ~ 3 ổ cắm. Dumping đống sau khi những người dùng ngắt kết nối sẽ hiển thị ~ 0 ổ cắm.


Bạn thực sự có thể sử dụng trình phân tích kết xuất bộ nhớ heap của Chrome với các vùng đống Node.js.


Just fyi, các hàm sẽ hiển thị trong vùng chứa đống dưới phần (closure).

Bạn sẽ muốn đảm bảo rằng bạn đặt tên cho các chức năng của mình (ngay cả khi chúng không cần tên) để chúng hiển thị dưới dạng thứ gì đó hữu ích trong vùng lưu trữ.

Ví dụ, một cái gì đó giống như

function() { }

sẽ chỉ hiển thị như function() trong đống đổ. Trong trường hợp như:

function taggedFunction() { }

sẽ hiển thị như function taggedFunction() trong đống đổ. Nếu bạn tạo 100 taggedFunctions thì bạn sẽ thấy taggeFunction trong vùng chứa đống 100 lần. Về cơ bản, đặt tên cho các hàm của bạn cho phép bạn tìm ra nếu bạn tiếp tục tạo và rò rỉ chúng.

+1

+1 để có câu trả lời tuyệt vời với các liên kết tốt và phê bình mang tính xây dựng trên mã OP –

+0

SetInterval nên phổ biến cho mọi kết nối. Nó được sử dụng để có cùng một thời gian hiển thị cho mỗi người dùng. Có lẽ có một cách khác để làm điều đó? – BenoitD

+0

Tôi sẽ xem xét hồ sơ heap. Cảm ơn – BenoitD