Có hai cách tiếp cận để hạn chế việc sử dụng bộ nhớ của bạn: Ex post facto và prejectionive. Điều đó có nghĩa là, bạn có thể cố gắng giết chương trình của mình sau khi nó quá lớn hoặc bạn có thể lập trình để nó không quá lớn ngay từ đầu.
Nếu bạn nhấn mạnh vào cách tiếp cận bài thực tế, bạn có thể sử dụng tập lệnh Bash sau. Tập lệnh này trước tiên tìm thấy dung lượng bộ nhớ (như được xác định bởi "kích thước tập hợp lưu trú") mà quá trình với pid processid đang sử dụng, lọc ra tất cả dữ liệu không phải là số bằng grep và lưu số lượng dưới dạng biến n. Tập lệnh sau đó kiểm tra nếu n lớn hơn x được chỉ định của bạn. Nếu có, quá trình với pid processid bị giết.
Xin lưu ý:
- Bạn phải thay thế
<pid>
bằng id quá trình của chương trình của bạn.
- Bạn phải thay thế
<x>
bằng rss = "kích thước cài đặt thường trú" (nghĩa là kích thước bộ nhớ thực) mà bạn không muốn chương trình vượt quá.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Nếu bạn muốn điều này chạy mỗi y giây, chỉ cần đưa nó vào một vòng lặp, và bảo nó đợi y giây sau mỗi lần lặp. Bạn cũng có thể viết một lệnh tương tự bằng cách sử dụng top
. Điểm khởi đầu của bạn sẽ là top -l 1|grep "<pid>"|awk '{print $10}'
.
Câu trả lời của @ kenorb đã giúp tôi với kịch bản của mình
Mặc dù tôi tin rằng câu trả lời cho câu hỏi, về lâu dài tôi tin rằng đó là thiết kế lập trình tốt hơn để thực hiện một phương pháp phòng ngừa bằng cách sử dụng cấp phát bộ nhớ thủ công.
Đầu tiên, bạn có chắc việc sử dụng bộ nhớ thực sự là một vấn đề? Tài liệu về Go nêu rõ:
Bộ cấp phát bộ nhớ Go dành một vùng bộ nhớ ảo lớn làm đấu trường để phân bổ. Bộ nhớ ảo này là cục bộ của quá trình Go cụ thể; việc bảo lưu không làm mất các quá trình khác của bộ nhớ.
Nếu bạn vẫn nghĩ rằng bạn có vấn đề, thì tôi khuyến khích bạn tự quản lý bộ nhớ của mình như được thực hiện bằng ngôn ngữ lập trình C. Vì go được viết bằng C, tôi nghi ngờ sẽ có cách để vào quản lý / phân bổ bộ nhớ C, và thực sự là có. Xem kho lưu trữ github này,
cho phép bạn thực hiện quản lý bộ nhớ thủ công thông qua bộ cấp phát C tiêu chuẩn cho hệ thống của bạn. Nó là một lớp bọc mỏng trên đầu malloc, calloc và miễn phí. Xem man malloc để biết chi tiết về các chức năng này cho hệ thống của bạn. Thư viện này sử dụng cgo.
Trường hợp sử dụng được đưa ra là:
Tại sao bạn muốn điều này?
Khi một chương trình gây ra áp lực bộ nhớ hoặc hệ thống sắp hết bộ nhớ, có thể hữu ích để kiểm soát thủ công phân bổ bộ nhớ và giải quyết. Go có thể giúp bạn kiểm soát phân bổ nhưng không thể giải quyết rõ ràng dữ liệu không cần thiết.
Đây có vẻ như là một giải pháp lâu dài tốt hơn.
Nếu bạn muốn tìm hiểu thêm về C (bao gồm quản lý bộ nhớ),
Ngôn ngữ lập trình C là tài liệu tham khảo tiêu chuẩn.