Tôi là một nhà phát triển làm việc trên một ứng dụng 32bit rất lớn, bộ nhớ chuyên sâu. Chạy ra khỏi không gian địa chỉ ảo (bộ nhớ) là một vấn đề đối với chúng tôi. Trong quá trình điều tra của tôi về một số vấn đề gần đây, tôi nhận thấy một phần lớn bộ nhớ được dành riêng bởi IOKit (512MB). Bộ nhớ này không được cấp phát nhưng chỉ được đặt trước. Điều tra sâu hơn cho thấy hầu hết các ứng dụng (Safari, iTunes, vv) đều dự trữ phần bộ nhớ này. Dường như nó vẫn chưa được phân bổ. Tôi đang sử dụng vmmap để kiểm tra. Ví dụ: đây là ứng dụng Cocoa được tạo bằng XCode, sử dụng mẫu mặc định:Làm cách nào để giảm dung lượng bộ nhớ IOKit khi khởi động quá trình?
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
Tôi có thể làm gì để giảm hoặc loại bỏ bộ nhớ đó? Ứng dụng của chúng tôi thực sự có thể sử dụng 512MB đó !!!
EDIT: Tôi đã nghiên cứu thêm một chút và có vẻ như đoạn dữ liệu này là bộ đệm khung hình video được ánh xạ vào không gian người dùng. Vì vậy, tôi đoán một câu hỏi chính xác hơn là nếu có anyway để hạn chế framebuffer chiếm hơn một phần lớn của không gian địa chỉ chế độ người dùng ảo?
EDIT: Đã thực hiện thêm một số thử nghiệm và tìm thấy khóa cần thay đổi là IOFBMemorySize. Như được hiển thị nếu bạn thực hiện lệnh này:
ioreg -l | grep IOFBMemorySize
Hoặc bạn có thể thấy nó trong IORegistryExplorer. Tôi đã không thành công trong việc thay đổi giá trị đó mặc dù. Tôi đã thử thêm nó vào Info.plist cho ATIFramebuffer.kext, không tốt. Tôi đã thử viết một chương trình gọi IOConnectSetCFProperty, nhưng nó trả về kIOReturnUnsupported.
EDIT: Sau khi nghiên cứu thêm, có vẻ như khóa IOFBMemorySize này có khả năng chỉ đọc, chỉ cần báo cáo số lượng bộ nhớ có sẵn trên thẻ video. Có vẻ như có một số giá trị thú vị trong Configuration.plist cho CoreGraphics, nhưng không cái nào trong số chúng dường như ảnh hưởng đến cấp phát bộ nhớ (ngay cả sau khi khởi động lại).
A) nó là lấy 512MB không gian địa chỉ ảo, dựa trên kích thước của bộ đệm khung. B) có không gian địa chỉ ảo. Trong đó một ứng dụng 32bit có 4GB. C) Không thực sự trả lời câu hỏi. – pj4533
Nó không quan trọng có bao nhiêu địa chỉ có sẵn, nó quan trọng bao nhiêu bộ nhớ có sẵn, chỉ vì bạn có thể đếm đến một số không có nghĩa là bạn có nhiều bit. –
Ummmm .... không chắc chắn tôi hiểu những gì bạn đang nói, nhưng nó hoàn toàn quan trọng có bao nhiêu địa chỉ có sẵn (32bit vs 64bit). Thực tế là các tác vụ 32bit có (khoảng) 4GB không gian địa chỉ ảo. Sau khi được sử dụng, phân bổ bộ nhớ không thành công. IOKit đang đặt 512MB không gian địa chỉ ảo cho trình gỡ khung thẻ video và tôi muốn biết cách giảm mức đó xuống một lượng nhỏ hơn. – pj4533