메모리 사용을 제한하는 두 가지 방법이 있습니다 : 사후 사실과 선점. 즉, 프로그램이 너무 커진 후에 프로그램을 종료하려고 시도하거나 처음에는 너무 커지지 않도록 프로그램 할 수 있습니다.
ex post facto 접근법을 고집하는 경우 다음 Bash 스크립트를 사용할 수 있습니다. 이 스크립트는 먼저 processid pid를 사용하는 프로세스가 사용중인 메모리의 양 ( "상주 세트 크기"로 정의 된대로)을 찾고 grep을 사용하여 숫자가 아닌 모든 데이터를 필터링하고 그 양을 변수 n으로 저장합니다. 그런 다음 스크립트는 n이 지정된 x보다 큰지 확인합니다. 그렇다면 processid가 pid 인 프로세스가 종료됩니다.
참고 :
<pid>
프로그램의 프로세스 ID로 바꿔야합니다 .
- 당신은 대체해야
<x>
이 프로그램은 초과하지 않을 RSS = "상주 세트 크기"(즉, 실제 메모리 크기)와 함께.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
이것을 y 초마다 실행하려면 루프로 묶고 매 반복마다 y 초 동안 기다리라고 지시하십시오. 을 사용하여 비슷한 명령을 작성할 수도 있습니다 top
. 시작점은입니다 top -l 1|grep "<pid>"|awk '{print $10}'
.
@ kenorb의 대답 은 내 스크립트로 도움이되었습니다.
나는 그 질문에 대답한다고 생각하지만 장기적으로 수동 메모리 할당을 사용하여 선제 적 접근 방식을 취하는 것이 더 나은 프로그래밍 디자인이라고 생각합니다.
첫째, 메모리 사용량이 실제로 문제가됩니까? Go 설명서 에는 다음이 명시되어 있습니다.
Go 메모리 할당자는 할당 영역으로 가상 메모리의 넓은 영역을 예약합니다. 이 가상 메모리는 특정 Go 프로세스에 로컬입니다. 예약은 다른 메모리 프로세스를 박탈하지 않습니다.
여전히 문제가 있다고 생각되면 C 프로그래밍 언어에서와 같이 메모리를 수동으로 관리하는 것이 좋습니다. go는 C로 작성되었으므로 C 메모리 관리 / 할당에 들어가는 방법이있을 것 같았고 실제로 있습니다. 이 github 저장소를 참조하십시오 .
시스템의 표준 C 할당자를 통해 수동 메모리 관리를 수행 할 수 있습니다. 그것은 malloc, calloc의 상단에 얇은 포장지이며 무료입니다. 시스템의 이러한 기능에 대한 자세한 내용은 man malloc을 참조하십시오. 이 라이브러리는 cgo를 사용합니다.
사용 사례는 다음과 같습니다.
왜 이것을 원하십니까?
프로그램이 메모리 부족을 유발하거나 시스템 메모리가 부족한 경우 메모리 할당 및 할당 해제를 수동으로 제어하는 것이 도움이 될 수 있습니다. Go를 사용하면 할당을 제어 할 수 있지만 불필요한 데이터를 명시 적으로 할당 취소 할 수는 없습니다.
이것은 더 나은 장기 솔루션처럼 보입니다.
C (메모리 관리 포함)에 대해 더 배우려면
C 프로그래밍 언어 가 표준 참조입니다.