Bạn làm gì khi malloc
trả về 0 hoặc ném ngoại lệ mới? Chỉ cần dừng lại hoặc cố gắng sống sót trong điều kiện OOM / lưu công việc của người dùng?
Bạn làm gì khi malloc
trả về 0 hoặc ném ngoại lệ mới? Chỉ cần dừng lại hoặc cố gắng sống sót trong điều kiện OOM / lưu công việc của người dùng?
Câu trả lời:
Tôi sẽ tránh OOM như tránh một vụ tai nạn.
Tránh làm một khối lượng lớn công việc (và phân bổ khối lượng lớn bộ nhớ) cùng một lúc. Giữ dữ liệu trên đĩa, tin tưởng vào bộ đệm đĩa hệ điều hành và sử dụng IO ánh xạ bộ nhớ càng nhiều càng tốt và chỉ hoạt động trên một phần nhỏ dữ liệu tại một thời điểm. Nếu một lượng lớn dữ liệu cần phải được thực hiện trực tuyến (được phục vụ với độ trễ thấp) thì hãy giữ chúng trong bộ nhớ trên một số máy, giống như tất cả các công ty công cụ tìm kiếm lớn làm. Hoặc mua SSD.
Hầu hết mọi người trả lời câu hỏi này có lẽ chưa bao giờ làm việc trên các hệ thống nhúng, trong đó malloc trả về 0 là một khả năng rất thực tế. Trên một hệ thống tôi hiện đang làm việc, có tổng cộng 4,25K byte RAM (đó là 4352 byte). Tôi đang phân bổ 64 byte cho ngăn xếp và hiện có một đống 1600 byte. Mới hôm qua tôi đã gỡ lỗi một thói quen đi bộ heap để tôi có thể làm theo sự phân bổ và giải phóng bộ nhớ. Heap walk sử dụng bộ đệm được phân bổ tĩnh (30 byte) nhỏ để xuất ra cổng nối tiếp. Nó sẽ bị tắt cho phiên bản phát hành.
Vì đây là một sản phẩm tiêu dùng, tốt hơn hết là không hết bộ nhớ một khi sản phẩm đã được phát hành. Tôi chắc chắn rằng nó sẽ trong quá trình phát triển. Trong mọi trường hợp, về tất cả những gì tôi có thể làm là phát ra tiếng bíp cho người nói một vài lần và buộc khởi động lại.
Thành thật mà nói, trong tất cả các dự án tôi đã thực hiện (hãy nhớ rằng tôi chưa làm việc ở bất cứ đâu), tôi chưa bao giờ nghĩ rằng điều đó có thể xảy ra, và do đó tôi cho rằng các chương trình của tôi sẽ chết rất nhanh.
Bên cạnh đó, việc xử lý một OOM đòi hỏi bạn phải phân bổ các tài nguyên để hiển thị thông báo lỗi hoặc lưu tất cả mọi thứ, điều này có thể gây bất tiện.
Tôi cảm thấy rằng những ngày này, bộ nhớ có giá thấp hơn đậu phộng, đó không phải là điều nên xảy ra thường xuyên. Vào buổi bình minh của ký ức được bảo vệ và trước đây, có lẽ đó là một mối quan tâm, nhưng bây giờ thì sao? Các lỗi OOM duy nhất tôi từng thấy là từ mã lỗi.
Kiểm tra mã trả lại malloc dù sao cũng vô nghĩa.
Các hệ điều hành hiện đại vượt quá bộ nhớ: Chúng cung cấp cho các tiến trình nhiều bộ nhớ hơn thực tế có sẵn. Bộ nhớ mà quá trình của bạn được cấp là ảo, tất cả được ánh xạ tới một trang không có trang.
Mãi cho đến khi bạn ghi vào bộ nhớ rằng một trang vật lý, duy nhất được phân bổ cho các quy trình của bạn. Nếu sự phân bổ này không thành công, kernel sẽ chấm dứt một tiến trình (có lẽ là của bạn!) Trong nỗ lực tìm kiếm bộ nhớ. Tại thời điểm đó, bạn không thể làm gì hơn nữa.
Trừ khi bạn đang phát triển cho các hệ thống nhúng, hệ thống thời gian thực hoặc hệ thống nghiêm trọng đến mức các sự cố có thể phải trả giá, hoặc hàng tỷ đô la ... thì có lẽ không đáng để lo lắng về điều kiện bộ nhớ.
Trong hầu hết các trường hợp, có rất ít việc có thể được thực hiện khi bạn hết bộ nhớ, vì không có bộ nhớ để tạo bất kỳ đối tượng mới nào hoặc thực hiện bất kỳ tác vụ nào có thể làm gì đó. Bạn phải cân nhắc chi phí của ứng dụng xử lý OOM so với lợi ích bạn nhận được từ việc đó.
Tôi sẽ luôn luôn kiểm tra lỗi. Nếu một cái gì đó trả về một điều kiện lỗi, thì nó phải được xử lý bởi chương trình của bạn. Ngay cả khi đó là một thông báo có nội dung "Hết bộ nhớ, bạn phải đi!", Nó vẫn tốt hơn "Vi phạm truy cập", "đổ lõi" hoặc bất cứ điều gì. Một là một điều kiện lỗi bạn xử lý, hai là một lỗi. Và người dùng sẽ cảm nhận nó như vậy là tốt.
Đối với trường hợp cụ thể của bạn, bạn có thể cố gắng khôi phục hoạt động, giải phóng các tài nguyên mà bạn đã phân bổ cho đến khi gặp sự cố, báo cáo lỗi và tiếp tục thực hiện (có thể khi bạn đang cố thoát khỏi ứng dụng, bạn có thể cung cấp cho tùy chọn để thoát ngay lập tức). Bằng cách này, người dùng có thể quyết định phải làm gì hoặc cố gắng giải phóng bộ nhớ bằng cách xử lý xung quanh, đóng tệp, v.v ... Tất nhiên, cách bạn có thể xử lý tình huống phụ thuộc nhiều vào chương trình của bạn - một chương trình không được cho là có thể tương tác có lẽ chỉ cần ghi lại lỗi và thoát hoặc tiếp tục.