Bellek kullanımınızı sınırlamak için iki yaklaşım vardır: Ex facto ve preemptive. Yani, programınız çok büyüdükten sonra öldürmeye çalışabilirsiniz ya da ilk etapta çok büyük olmamak için programlayabilirsiniz.
Eski post facto yaklaşımında ısrar ediyorsanız, aşağıdaki Bash betiğini kullanabilirsiniz. Bu komut dosyası ilk olarak processid pid ile işlemin kullandığı bellek miktarını bulur ("yerleşik küme boyutu" ile tanımlandığı gibi), grep kullanarak sayısal olmayan tüm verileri filtreler ve miktarı n değişkeni olarak kaydeder. Komut dosyası n'nin belirttiğiniz x değerinden büyük olup olmadığını denetler. Eğer öyleyse, processid pid ile süreç öldürülür.
Lütfen aklınızda bulundurun:
<pid>
Programınızın işlem kimliğiyle değiştirmelisiniz .
- Sen değiştirmeniz gerekir
<x>
program aşmak istemiyorum rss = "yerleşik seti boyutu" (yani gerçek bellek boyutu) ile.
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
Bunun her y saniyede bir çalışmasını istiyorsanız, sadece bir döngüye koyun ve her yinelemeden sonra y saniye beklemesini söyleyin. Bunu kullanarak da benzer bir komut yazabilirsiniz top
. Başlangıç noktanız olurdu top -l 1|grep "<pid>"|awk '{print $10}'
.
@ kenorb'un yanıtı senaryomda bana yardımcı oldu
Soruyu cevapladığına inanırken uzun vadede manuel bellek tahsisini kullanarak önleyici bir yaklaşım benimsemenin daha iyi bir programlama tasarımı olduğuna inanıyorum.
Öncelikle, bellek kullanımının gerçekten bir sorun olduğundan emin misiniz? Go belgeleri şunları belirtir:
Go bellek ayırıcısı, geniş bir sanal bellek bölgesini ayırma alanı olarak ayırır. Bu sanal bellek, belirli Git işlemi için yereldir; rezervasyon diğer bellek işlemlerini mahrum bırakmaz.
Hâlâ bir sorununuz olduğunu düşünüyorsanız, belleğinizi C programlama dilinde yapıldığı gibi manuel olarak yönetmenizi öneririm. Go C yazıldığından, C bellek yönetimine / tahsisatına girmenin yolları olabileceğinden şüphelendim ve gerçekten de var. Bu github deposuna bakın ,
sisteminiz için standart C ayırıcı üzerinden manuel bellek yönetimi yapmanızı sağlar. Malloc, calloc ve içermeyen ince bir sargıdır. Sisteminiz için bu işlevlerle ilgili ayrıntılar için man malloc'a bakın. Bu kütüphane cgo kullanıyor.
Kullanım durumu şu şekilde verilir:
Bunu neden istiyorsun?
Bir program bellek basıncına neden oluyorsa veya sistem belleği yetersiz kalıyorsa, bellek ayırmalarını ve yeniden konumlandırmaları el ile kontrol etmek yararlı olabilir. Go, tahsisleri kontrol etmenize yardımcı olabilir, ancak gereksiz verileri açıkça yeniden konumlandırmak mümkün değildir.
Bu daha iyi uzun vadeli bir çözüm gibi görünüyor.
C (bellek yönetimi dahil) hakkında daha fazla bilgi edinmek istiyorsanız,
C Programlama dili standart referanstır.