Jestem programistą pracującym nad bardzo dużą, intensywnie wykorzystującą pamięć aplikacją 32-bitową. Wyjście z wirtualnej przestrzeni adresowej (pamięci) jest dla nas problemem. Podczas mojego badania ostatnich problemów zauważyłem dużą porcję pamięci, która jest zarezerwowana przez IOKit (512 MB). Ta pamięć nie jest przydzielona, ale tylko zarezerwowana. Dalsze badania wykazały, że większość aplikacji (Safari, iTunes itp.) Również rezerwuje ten fragment pamięci. Wygląda na to, że pozostaje nieprzydzielony. Używam vmmap do testowania. Na przykład, tutaj jest to aplikacja kakao wykonane z Xcode, przy użyciu domyślnego szablonu:Jak zmniejszyć ilość rezerw IOKit w pamięci podczas uruchamiania procesu?
REGION TYPE VIRTUAL
=========== =======
CG backing stores 1008K
CG image 4K
CG raster data 64K
CG shared images 2252K
Carbon 7264K
CoreGraphics 16K
IOKit (reserved) 512.0M reserved VM address space (unallocated)
MALLOC 59.0M see MALLOC ZONE table below
MALLOC guard page 48K
MALLOC metadata 348K
Memory tag=242 12K
STACK GUARD 56.0M
Stack 8712K
VM_ALLOCATE 16.2M
__DATA 8296K
__IMAGE 1240K
__LINKEDIT 31.5M
__TEXT 76.7M
__UNICODE 536K
mapped file 27.4M
shared memory 1320K
=========== =======
TOTAL 809.2M
TOTAL, minus reserved VM space 297.2M
Czy mogę coś zrobić, aby zmniejszyć lub wyeliminować tę pulę pamięci? Nasza aplikacja naprawdę mogłaby wykorzystać to 512 MB !!!
EDYCJA: Zrobiłem więcej badań i wydaje się, że ta porcja pamięci to ramka bufora karty graficznej zamapowana w przestrzeń użytkownika. Sądzę więc, że dokładniejsze pytanie brzmi, czy istnieje limit bufora ramki, który przejmuje tak dużą część wirtualnej przestrzeni adresowej w trybie użytkownika?
EDYCJA: Przeprowadzono dalsze testy i stwierdzono, że kluczem do zmiany jest IOFBMemorySize. Jak pokazano, jeśli zrobić tego polecenia:
ioreg -l | grep IOFBMemorySize
Albo można zobaczyć go w IORegistryExplorer. Nie udało mi się jednak zmienić tej wartości. Próbowałem dodać go do Info.plist dla ATIFramebuffer.kext, no good. Próbowałem napisać program, który wywołuje IOConnectSetCFProperty, ale zwrócił kIOReturnUnsupported.
EDYCJA: Po dalszych badaniach wydaje się, że klucz IOFBMemorySize jest prawdopodobnie tylko do odczytu, po prostu raportując ilość pamięci dostępnej na karcie graficznej. Wydawało się, że w pliku Configuration.plist dla CoreGraphics znajdują się interesujące wartości, ale żaden z nich nie miał wpływu na przydzielanie pamięci (nawet po ponownym uruchomieniu komputera).
a), to jest chwytając 512 MB wirtualnej przestrzeni adresowej, która jest oparta na rozmiarze bufora ramki. B) tak, wirtualna przestrzeń adresowa. Z czego 32-bitowa aplikacja ma 4 gb. C) Naprawdę nie odpowiada na pytanie. – pj4533
Nie ma znaczenia, ile adresów jest dostępnych, ważne, ile pamięci jest dostępne, tylko dlatego, że można policzyć do liczby nie oznacza, że masz tyle bitów. –
Ummmm .... nie jestem pewien, czy rozumiem, co mówisz, ale absolutnie ma znaczenie ile adresów jest dostępnych (32bit vs 64bit). Faktem jest, że 32-bitowe zadania mają (w przybliżeniu) 4 GB wirtualnej przestrzeni adresowej. Po zastosowaniu alokacja pamięci kończy się niepowodzeniem. IOKit rezerwuje 512 MB wirtualnej przestrzeni adresowej dla framebuffera karty graficznej, i chcę wiedzieć, jak obniżyć to do mniejszej ilości. – pj4533