Khi chúng tôi bắt đầu thử nghiệm dự án NodeJS của chúng tôi, chúng tôi nhận thấy sự tham gia bộ nhớ lớn. Nó là do rò rỉ bộ nhớ trên tất cả các dự án của chúng tôi. Vì vậy, chúng tôi bắt đầu tìm kiếm tất cả các nguyên nhân có thể tạo ra rò rỉ bộ nhớ. Có một số câu trả lời cho câu hỏi đó trên stackoverflow, nhưng không có bất kỳ tài liệu chặt chẽ về những gì được và những gì không phải là một rò rỉ bộ nhớ.Rò rỉ bộ nhớ và sự cố đóng cửa trong NodeJS
Câu hỏi của tôi:
- Có một tài liệu trên V8 GC và làm thế nào nó hoạt động (chi tiết)?
- Cách phát hành cuộc gọi lại để GC có thể thu thập chúng?
Liệu V8 GC có thu thập các biến không được sử dụng nhưng có một chức năng đóng bên dưới chúng không? Ví dụ:
var serviceChannel = require('./channel'); var dataRegistration = require('../data/registration'); function registerOnChannel(userID, channelID, callsuccess, callerror) { serviceChannel.findChannel(channelID, function (channel) { if (!channel) { callerror("Channel doesn' exists"); return; } dataRegistration.registerOnChannel(userID, channelID, function (registration) { if (!registration) { callerror("Registration doesn' exists"); return; } callsuccess("Registration successful"); }, function (error) { callerror("Error on registration"); }) }, function (error) { callerror("Error on finding channel"); }) }
Vì vậy, serviceChannel và dataRegistration sẽ được giữ trong bộ nhớ càng lâu càng registerOnChanel là sống. Nhưng kênh biến sẽ bị xóa bởi GC (nó không được sử dụng bởi bất kỳ chức năng nào)?
"Vì vậy, serviceChannel và dataRegistration sẽ được lưu trong bộ nhớ miễn là registerOnChanel đang hoạt động". Làm thế nào để bạn đi đến kết luận đó? –
Đó là một đóng cửa. –
Không có bằng chứng đóng cửa trong mã bạn đăng, ít nhất không phải như vậy mà sẽ giữ serviceChannel hoặc dataRegistration còn sống. –