10

Gần đây tôi đã phát triển một ứng dụng xử lý một lượng lớn dữ liệu rất thường xuyên (~ 15 lần một phút). Để làm như vậy, tôi đã phân bổ một bộ nhớ lớn, sau đó giải phóng nó cho mỗi lô dữ liệu.Bộ nhớ Spiky "Khỏe mạnh" cho ứng dụng?

Dưới đây là một màn hình phân bổ bộ nhớ của tôi từ Instruments: The memory

sử dụng The Memory dao động từ khoảng 3MB xuống còn khoảng 30MB khá nhanh chóng. Tôi chỉ băn khoăn, đây có phải là "lành mạnh" cho iPhone không.

Có rủi ro khi phân bổ và giải phóng quá nhiều bộ nhớ quá nhanh không? Nó không bền vững, hay chỉ là thực hành xấu?

Cảm ơn!

+0

Không quan tâm, loại xử lý nào đang gây ra đột biến? Nó có xử lý hình ảnh không? –

+0

Có, phân tích hình ảnh thực sự, làm thế nào bạn biết? – pop850

Trả lời

7

Nó không phải là rủi ro cũng không nhất thiết phải thực hành xấu. Việc phân bổ và giải phóng bộ nhớ cần có thời gian, do đó, thực hiện nó rất thường xuyên so với thực hiện nó một lần và tái sử dụng bộ nhớ được cấp phát là một sự cân bằng giữa hiệu quả sử dụng bộ nhớ (sử dụng bộ nhớ thấp nhất ở mọi thời điểm) và hiệu năng.

Nếu hiệu suất của ứng dụng của bạn không bị ảnh hưởng vào lúc này, có thể bạn đã thực hiện lựa chọn đúng về sự cân bằng này cho ứng dụng của mình.

Nói chung, sử dụng 30 MB bộ nhớ là số tiền khá lớn cho các thiết bị cũ hơn (iPhone 3G trở lên). Bạn không thể chắc chắn rằng ứng dụng của bạn có nhiều bộ nhớ sẵn có để chuẩn bị nhận được cảnh báo bộ nhớ. Nếu ứng dụng của bạn không thể giảm mức sử dụng bộ nhớ khi nó nhận được cảnh báo bộ nhớ, hệ điều hành có thể sẽ xóa nó.

+0

Theo kinh nghiệm của tôi, bất cứ thứ gì trên 20-25MB sẽ khiến ứng dụng bị giết trên iPhone 3G. pop850, bạn nên kiểm tra điều này trên các thiết bị cũ hơn (nếu bạn quan tâm đến việc hỗ trợ chúng). Điều đó đang được nói, nếu ứng dụng của bạn không bị giết với lần tăng đột biến đầu tiên, làm nó nhiều lần có thể sẽ không giết nó. Miễn là không có rò rỉ. –

+0

Tôi nghĩ tôi sẽ phải thực hiện xử lý theo từng phần vì vậy tôi sử dụng ít bộ nhớ hơn, vì tôi không muốn giới hạn đối tượng của mình với các thiết bị mới hơn. Tuy nhiên, điều đó có vẻ hơi khó, vì tôi đã phân bổ hơn 180MB trước đó mà không bị rơi trên iPhone của tôi 4. Rất cám ơn câu trả lời. – pop850

-1

Nó phụ thuộc, nếu người dùng có iPhone 4 hoặc iPhone 3GS, nó sẽ có thể thực hiện được nhưng trên iPhone 3G nó sẽ dẫn đến cảnh báo bộ nhớ rất nhanh. iPhone 4 có RAM 256MB cho các ứng dụng (tổng cộng 512 mb) iPhone 3GS có 128mb cho ứng dụng và 256 trong tổng số iphone 3g chỉ có 128mb và 64mb cho ứng dụng .. thường có khoảng 40MB miễn phí khi không có các ứng dụng đang chạy.

Như táo nói rằng bạn chỉ nên phân bổ bộ nhớ bạn thực sự cần, và cố gắng không sử dụng autorelease quá nhiều, vì autorelease cho chúng ta một đối tượng được phân bổ trong khi chúng tôi không thực sự cần nó nữa

Nếu hiệu suất không phải là quá xấu, tôi sẽ cố gắng sử dụng bộ nhớ ít hơn và phân bổ nhiều hơn khi bạn thực sự cần nó.

+0

Bạn thực sự nên sử dụng các nhóm autorelease với các đối tượng autorelease và sử dụng chúng bất cứ khi nào cần thiết. – koo

+0

@Adam Ko nhưng sau đó bạn nên sử dụng bản phát hành, trong hầu hết các trường hợp, bạn có thể giữ lại tính chính mình và bạn sẽ không cần phải tự tạo hồ bơi. Trừ khi bạn đang làm osmething trong một vòng lặp mà sử dụng rất nhiều đối tượng autoreleased bạn nhận được thông qua một API –

+0

Vâng, không chắc chắn những gì bạn có ý nghĩa. Hành vi như được mô tả trong câu hỏi sẽ không gây ra cảnh báo bộ nhớ, trừ khi bạn đang cấp phát lượng bộ nhớ khổng lồ.Ngoài ra, bạn đang thực hiện một số khái quát khá lớn về bao nhiêu bộ nhớ có sẵn, nó không chính xác để nói 'iPhone 4 có 256mb cho các ứng dụng (512mb trong tổng số)'. Đó không phải là cách nó hoạt động trên phần cứng. – lxt

4

Nỗi lo chính của tôi trong những trường hợp này sẽ là phân mảnh. Nếu các khối là tất cả các kích thước tương tự mặc dù, bạn nên được tốt (và nhìn vào đồ thị của bạn, các đỉnh xuất hiện để được hoàn toàn cấp, vì vậy tôi nghĩ rằng đó là trường hợp).

Bạn sẽ thanh toán chi phí phân bổ, nhưng như Ole nói, nếu ứng dụng của bạn đang hoạt động đủ tốt, không có nhiều điểm trong việc cố gắng tối ưu hóa điều đó.

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