Tôi đã chơi một số thời gian với các bản dựng ứng dụng khác nhau của tôi và có những điều lạ lùng xảy ra:ca cao 64bit nhị phân bị rò rỉ bộ nhớ? (phát hành NSData không miễn phí bộ nhớ)
ứng dụng của tôi có dấu chân không hoạt động 5mb. khi tải lên bộ nhớ tệp có kích thước của tệp được đặt trước. sau khi tải lên bộ nhớ dành riêng nên được giải phóng. bây giờ có sự khác biệt trong bản dựng (gc = bộ thu gom rác):
- 32bit i386 no-GC: tất cả bộ nhớ đều được giải phóng ngay lập tức.
- 32bit i386 GC: gần như tất cả bộ nhớ đều được giải phóng tức thì. phần còn lại một thời gian sau đó.
- 64bit x86_64 no-GC: bộ nhớ tối thiểu được giải phóng. như 10%
- GC 64bit x86_64: không có bộ nhớ nào được giải phóng. bộ nhớ vẫn được dành riêng cho giờ. (hoạt động mon)
Tôi đang sử dụng LLVM với CLANG. tôi đã chạy các công cụ ngày nay mọi lúc và đang kiểm tra rò rỉ/thây ma/v.v. và mọi thứ dường như sạch sẽ. (ứng dụng khá đơn giản.)
có giải thích cho hành vi này không?
Cập nhật:
Đó là một số nội dung kỳ lạ. Tôi đã giải quyết vấn đề này:
Tôi tải một tệp 20MB vào một NSData và thả nó ra. Tôi đang làm điều này mà không có bất kỳ bộ sưu tập rác nào được kích hoạt. Mã này là:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
Khi tôi xây dựng cho i386 32bit 20mb được cấp phát và phát hành. Khi tôi chuyển đổi bản build thành 64bit x86_64 thì bản phát hành không làm gì cả. Thời gian lưu trú 20mb được phân bổ.
upper pic 32bit lower 64 http://kttns.org/zguxn
Không có sự khác biệt giữa hai ứng dụng ngoại trừ việc một thượng được xây dựng cho 32bit và thấp hơn một 64bit. Không có GC chạy. (Với GC được kích hoạt cùng một vấn đề xuất hiện.)
Cập nhật 2:
hành vi tương tự có thể được quan sát thấy khi tôi tạo ra một ứng dụng cacao mới từ đầu chỉ với mã trên trong applicationDidFinishLaunching :. Trong chế độ 64bit bộ nhớ không được giải phóng. i386 hoạt động như mong đợi.
Sự cố tương tự xuất hiện với NSString thay vì NSData. Nó cũng xuất hiện khi tôi khởi động hạt nhân 64bit. (Giữ 64 khi khởi động.)
Hệ điều hành là 10.6.0
Bạn đã thử phân bổ và deallocating rất nhiều trường hợp NSData để xem bộ nhớ cho bất kỳ người trong số họ được khai hoang? Nó có thể là chương trình không trả lại bộ nhớ cho hệ điều hành trừ khi có thiếu bộ nhớ. – Amok
Tôi chỉ cố gắng để tái sản xuất này trên 10.6 mà không có may mắn. Bạn đã gửi lỗi với ứng dụng thử nghiệm của mình chưa? – Ken
Ứng dụng của bạn hoạt động chính xác và không bị rò rỉ bộ nhớ. Xem câu trả lời của tôi bên dưới để biết giải thích bán chi tiết. – bbum