2016-09-09 19 views
10

Trường hợp My Test này, chỉ ra rằng khi sử dụng NSURLSession với kết nối HTTP/2 có vấn đề về bộ nhớ.NSURLSự suy giảm bộ nhớ HTTP/2

test1: iOS 9. HTTP/2 máy chủ

tôi sử dụng NSURLSession để tải lên tập tin 10M để 2 máy chủ HTTP /, nếu các tập tin được tải lên hoàn thành tất cả mọi thứ là ok, Nhưng nếu tôi hủy bỏ nhiệm vụ upload trước nó đã hoàn thành, 10 triệu sẽ không bao giờ phát hành.

test2: iOS 9. HTTPs1.1 máy chủ

tôi thử nghiệm cùng mã với một máy chủ tập tin https1.1, tôi hủy bỏ nhiệm vụ tải lên hay không, mọi thứ đều ok, bộ nhớ trở lại bình thường. (dữ liệu 10M được phát hành)

iOS Test3 8. HTTP/2 máy chủ

trường hợp này mọi thứ đều ok. (NSURLSession không giao thức đàm phán để HTTP/2)

Vì vậy, thậm chí có một số điều không phù hợp với việc sử dụng NSURLSession của tôi, hiệu năng NSURLSession không bình thường với HTTP/2.

Bên cạnh vấn đề bộ nhớ, khi sử dụng NSURLSession với HTTP/2 để tải lên tập tin kích thước phân đoạn tiến bộ là rất lớn (tháng 2M 'didSendBodyData' tại một cuộc gọi trở lại)

Tôi cũng đã đọc this page. SSL có thể lưu trữ một số thứ, nhưng không nên lưu toàn bộ tập tin. (Khi tôi hủy tác vụ hoặc yêu cầu hết thời gian chờ, rò rỉ bộ nhớ kích thước tệp 10M)

Bất cứ ai cũng biết được sự cố. Cảm ơn.


Câu hỏi cập nhật 0912: thêm một liên kết dự án thử nghiệm

dự án thử nghiệm: https://github.com/upyun/swift-sdk/tree/testleak

file:UPUtils.swift 
//Change the url to make comparison test. 

//let DEFAULT_UPYUN_FORM_API_DOMAIN = "http://v0.api.upyun.com"//http1.1 
//let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://httpbin.org/post" //https1.1 
let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://v0.api.upyun.com"//http2 
+1

bài viết mã của bạn. – Segev

+0

Đã thêm liên kết vào dự án thử nghiệm và \t đã chỉnh sửa câu hỏi gốc. Cảm ơn vì đã dành thời gian cho tôi. @Segev – rotoava

+0

Tôi khuyên bạn nên sử dụng uploadTaskWithStreamedRequest để tải lên lớn –

Trả lời

1

Từ táo doc:

Đối tượng phiên giữ một tài liệu tham khảo mạnh mẽ cho người được ủy quyền cho đến khi ứng dụng của bạn thoát hoặc vô hiệu hóa một cách rõ ràng t anh ấy phiên. Nếu bạn không làm mất hiệu lực phiên, ứng dụng của bạn sẽ rò rỉ bộ nhớ cho đến khi nó thoát.

Cũng nhìn vào dự án của bạn https://github.com/upyun/swift-sdk/tree/testleak bạn cần phải gọi finishTasksAndInvalidate() sau khi sessionTask.resume() kể từ khi bạn đang tạo phiên theo yêu cầu

Các vấn đề liên quan