คำถามติดแท็ก memory-management

กระบวนการจัดสรรและเพิ่มส่วนของหน่วยความจำกายภาพแบบไดนามิกเพื่อตอบสนองต่อคำขอของโปรแกรมด้วยความเป็นธรรมและไม่มีความอดอยากในหมู่ผู้ร้องขอหากเป็นไปได้

8
เมื่อใดที่ฉันควรปล่อยวัตถุใน - (โมฆะ) viewDidUnload แทนที่จะเป็นใน -dealloc
อะไรคือสิ่งที่-(void)viewDidUnloadดี? ฉันไม่สามารถเชื่อมโยงทุกอย่างได้-deallocหรือไม่? ถ้ามุมมองยกเลิกการโหลดจะไม่-deallocถูกเรียกใช่ไหม

20
มีอะไรผิดปกติเกี่ยวกับการใช้ GC.Collect ()?
แม้ว่าฉันจะเข้าใจถึงผลกระทบที่ร้ายแรงของการเล่นกับฟังก์ชันนี้ (หรืออย่างน้อยก็คือสิ่งที่ฉันคิด) แต่ฉันก็ไม่เข้าใจว่าทำไมมันถึงกลายเป็นหนึ่งในสิ่งเหล่านี้ที่โปรแกรมเมอร์ผู้มีหน้ามีตาไม่เคยใช้แม้แต่คนที่ไม่รู้ด้วยซ้ำ มีไว้ทำอะไร. สมมติว่าฉันกำลังพัฒนาแอปพลิเคชันที่การใช้งานหน่วยความจำแตกต่างกันมากขึ้นอยู่กับสิ่งที่ผู้ใช้ทำ วงจรชีวิตของแอปพลิเคชันสามารถแบ่งออกเป็นสองขั้นตอนหลัก: การแก้ไขและการประมวลผลแบบเรียลไทม์ ในระหว่างขั้นตอนการแก้ไขสมมติว่ามีการสร้างวัตถุหลายพันล้านหรือหลายล้านล้านชิ้น บางคนมีขนาดเล็กและบางคนไม่มีบางคนอาจมีเข้ารอบสุดท้ายและบางคนอาจไม่มีและสมมติว่าช่วงชีวิตของพวกเขาแตกต่างกันไปตั้งแต่ไม่กี่มิลลิวินาทีไปจนถึงชั่วโมงที่ยาวนาน จากนั้นผู้ใช้จะตัดสินใจเปลี่ยนไปใช้ขั้นตอนแบบเรียลไทม์ ณ จุดนี้สมมติว่าประสิทธิภาพมีบทบาทพื้นฐานและการเปลี่ยนแปลงขั้นตอนของโปรแกรมเพียงเล็กน้อยอาจนำมาซึ่งผลที่ตามมาอย่างหายนะ การสร้างออบเจ็กต์จะลดลงเหลือน้อยที่สุดเท่าที่จะเป็นไปได้โดยใช้พูลอ็อบเจ็กต์และจากนั้น GC จะส่งเสียงกังวานโดยไม่คาดคิดและโยนมันออกไปทั้งหมดและมีคนตาย คำถาม: ในกรณีนี้ไม่ควรเรียก GC.Collect () ก่อนเข้าสู่ขั้นตอนที่สองหรือไม่? ท้ายที่สุดทั้งสองขั้นตอนนี้ไม่เคยเหลื่อมเวลาซึ่งกันและกันและการเพิ่มประสิทธิภาพและสถิติทั้งหมดที่ GC รวบรวมได้จะมีประโยชน์เพียงเล็กน้อยที่นี่ ... หมายเหตุ: ดังที่คุณบางคนได้ชี้ให้เห็นว่า. NET อาจไม่ใช่แพลตฟอร์มที่ดีที่สุดสำหรับแอปพลิเคชันเช่นนี้ แต่อยู่นอกเหนือขอบเขตของคำถามนี้ มีวัตถุประสงค์เพื่อชี้แจงว่าการเรียก GC.Collect () สามารถปรับปรุงพฤติกรรม / ประสิทธิภาพโดยรวมของแอปพลิเคชันได้หรือไม่ เราทุกคนยอมรับว่าสถานการณ์ที่คุณจะทำสิ่งนั้นหายากมาก แต่แล้วอีกครั้ง GC พยายามที่จะคาดเดาและทำได้ดีเกือบตลอดเวลา แต่ก็ยังเกี่ยวกับการคาดเดา ขอบคุณ.

4
ความแตกต่างระหว่างหน่วยความจำเสมือนและหน่วยความจำกายภาพคืออะไร?
ฉันมักสับสนกับแนวคิดของการจำลองเสมือนในระบบปฏิบัติการ พิจารณา RAM เป็นหน่วยความจำกายภาพทำไมเราต้องใช้หน่วยความจำเสมือนในการดำเนินการกระบวนการ? หน่วยความจำเสมือนนี้อยู่ที่ไหนเมื่อกระบวนการ (โปรแกรม) จากฮาร์ดไดรฟ์ภายนอกถูกนำไปยังหน่วยความจำหลัก (หน่วยความจำกายภาพ) เพื่อดำเนินการ ใครดูแลหน่วยความจำเสมือนและขนาดของหน่วยความจำเสมือนคืออะไร? สมมติว่าขนาดของ RAM คือ 4GB (เช่นช่องว่างที่อยู่ 2 ^ 32-1) ขนาดของหน่วยความจำเสมือนคืออะไร?

4
ความหมายของคำศัพท์ที่เกี่ยวข้องกับความจำคืออะไร?
ฉันกำลังอ่านหนังสือเกี่ยวกับหน่วยความจำเป็นแนวคิดในการเขียนโปรแกรม ในหนึ่งในบทต่อมาผู้เขียนใช้คำว่าเวทีอย่างหนักแต่ไม่เคยให้คำจำกัดความ ฉันได้ค้นหาความหมายของคำและความเกี่ยวข้องกับความทรงจำ แต่ก็ไม่พบอะไรเลย ต่อไปนี้เป็นบริบทบางส่วนที่ผู้เขียนใช้คำนี้: "ตัวอย่างถัดไปของการทำให้เป็นอนุกรมประกอบด้วยกลยุทธ์ที่เรียกว่าการจัดสรรหน่วยความจำจากเวทีเฉพาะ" "... สิ่งนี้มีประโยชน์เมื่อจัดการกับการรั่วไหลของหน่วยความจำหรือเมื่อจัดสรรจากอารีน่าเฉพาะ" "... ถ้าเราต้องการ deallocate หน่วยความจำแล้วเราจะ deallocate ทั้งเวที ." ผู้เขียนใช้คำว่า 100 กว่าครั้งในหนึ่งบท คำจำกัดความเดียวในอภิธานศัพท์คือ: การจัดสรรจากอารีน่า - เทคนิคการจัดสรรอารีน่าก่อนจากนั้นจัดการการจัดสรร / การจัดสรรภายในเวทีโดยโปรแกรมเอง (แทนที่จะเป็นโดยผู้จัดการหน่วยความจำกระบวนการ) ใช้สำหรับการบดอัดและการทำให้เป็นอนุกรมของโครงสร้างข้อมูลและวัตถุที่ซับซ้อนหรือสำหรับการจัดการหน่วยความจำในระบบที่มีความสำคัญด้านความปลอดภัยและ / หรือทนต่อความผิดพลาด ใครสามารถกำหนดเวทีให้ฉันด้วยบริบทเหล่านี้?

10
jQuery หรือ javascript เพื่อค้นหาการใช้หน่วยความจำของเพจ
มีวิธีค้นหาว่าหน้าเว็บใช้หน่วยความจำมากแค่ไหนหรือโดยแอปพลิเคชัน jquery ของฉัน นี่คือสถานการณ์ของฉัน: ฉันกำลังสร้างเว็บแอปที่มีข้อมูลจำนวนมากโดยใช้ส่วนหน้า jquery และแบ็กเอนด์ที่เงียบสงบซึ่งให้บริการข้อมูลใน JSON โหลดหน้าเว็บครั้งเดียวจากนั้นทุกอย่างจะเกิดขึ้นผ่าน ajax UI ช่วยให้ผู้ใช้สามารถสร้างแท็บต่างๆภายใน UI และแต่ละแท็บสามารถมีข้อมูลจำนวนมากได้ ฉันกำลังพิจารณาที่จะ จำกัด จำนวนแท็บที่พวกเขาสามารถสร้างได้ แต่ก็คิดว่าจะเป็นการดีที่จะ จำกัด เฉพาะเมื่อการใช้งานหน่วยความจำเกินเกณฑ์ที่กำหนด จากคำตอบฉันต้องการชี้แจงบางส่วน: ฉันกำลังมองหาโซลูชันรันไทม์ (ไม่ใช่แค่เครื่องมือสำหรับนักพัฒนา) เพื่อให้แอปพลิเคชันของฉันสามารถกำหนดการทำงานตามการใช้หน่วยความจำในเบราว์เซอร์ของผู้ใช้ การนับองค์ประกอบ DOM หรือขนาดเอกสารอาจเป็นการประมาณที่ดี แต่อาจมีความคลาดเคลื่อนได้มากเนื่องจากจะไม่รวมการโยงเหตุการณ์ข้อมูล () ปลั๊กอินและโครงสร้างข้อมูลในหน่วยความจำอื่น ๆ

7
ความแตกต่างระหว่างการจัดสรรหน่วยความจำแบบคงที่และการจัดสรรหน่วยความจำแบบไดนามิก
ฉันต้องการทราบว่าอะไรคือความแตกต่างระหว่างการจัดสรรหน่วยความจำแบบคงที่และการจัดสรรหน่วยความจำแบบไดนามิก คุณช่วยอธิบายเรื่องนี้ด้วยตัวอย่างได้ไหม

7
การกระจายตัวของวัตถุขนาดใหญ่
แอปพลิเคชัน C # /. NET ที่ฉันกำลังทำงานอยู่มีปัญหาหน่วยความจำรั่วช้า ฉันใช้ CDB กับ SOS เพื่อตรวจสอบสิ่งที่เกิดขึ้น แต่ดูเหมือนว่าข้อมูลจะไม่สมเหตุสมผลดังนั้นฉันหวังว่าคุณคนใดคนหนึ่งอาจเคยมีประสบการณ์นี้มาก่อน แอปพลิเคชันกำลังทำงานบนเฟรมเวิร์ก 64 บิต มันกำลังคำนวณและจัดลำดับข้อมูลไปยังโฮสต์ระยะไกลอย่างต่อเนื่องและกำลังกดปุ่ม Large Object Heap (LOH) อยู่พอสมควร อย่างไรก็ตามวัตถุ LOH ส่วนใหญ่ที่ฉันคาดว่าจะเป็นแบบชั่วคราว: เมื่อการคำนวณเสร็จสมบูรณ์และถูกส่งไปยังโฮสต์ระยะไกลหน่วยความจำควรจะว่าง อย่างไรก็ตามสิ่งที่ฉันเห็นคืออาร์เรย์อ็อบเจ็กต์ (สด) จำนวนมากที่สอดแทรกด้วยบล็อกหน่วยความจำว่างเช่นการสุ่มเซกเมนต์จาก LOH: 0:000> !DumpHeap 000000005b5b1000 000000006351da10 Address MT Size ... 000000005d4f92e0 0000064280c7c970 16147872 000000005e45f880 00000000001661d0 1901752 Free 000000005e62fd38 00000642788d8ba8 1056 <-- 000000005e630158 00000000001661d0 …

7
ฉันจะให้หน่วยความจำ eclipse มากกว่า 512M ได้อย่างไร
ฉันมีการตั้งค่าต่อไปนี้ แต่เมื่อฉันใส่ 1024 และแทนที่ 512 ทั้งหมดด้วย 1024 คราสจะไม่เริ่มต้นเลย ฉันจะมีหน่วยความจำมากกว่า 512M สำหรับ eclipse JVM ของฉันได้อย่างไร -startup plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519 -product com.springsource.sts.ide --launcher.XXMaxPermSize 512M -vm C:\Program Files (x86)\Java\jdk1.6.0_18\bin\javaw -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx512m -XX:MaxPermSize=512m

2
จำเป็นต้องใช้ autoreleasepool ในโปรแกรม Swift หรือไม่?
ในหน้า 17 ของงานนำเสนอ WWDC14 นี้มีข้อความว่า การทำงานกับ Objective-C? ยังต้องจัดการ autoreleasepool พูลการปล่อยอัตโนมัติ {/ * code * /} นั่นหมายความว่าอย่างไร? หมายความว่าถ้าฐานรหัสของฉันไม่มีไฟล์ Objective-C autoreleasepool {}ก็ไม่จำเป็น? ในคำตอบของคำถามที่เกี่ยวข้องมีตัวอย่างที่autoreleasepoolสามารถเป็นประโยชน์: - (void)useALoadOfNumbers { for (int j = 0; j < 10000; ++j) { @autoreleasepool { for (int i = 0; i < 10000; ++i) { NSNumber *number = [NSNumber …


3
“ memory stomp” คืออะไร?
ฉันเพิ่งเจอบล็อกโพสต์นี้ซึ่งกล่าวถึง“ ความทรงจำที่ย่ำแย่” โปรแกรม C ++ ที่สามารถเหยียบหน่วยความจำได้อย่างง่ายดาย (สิ่งที่คุณอาจไม่เคยได้ยินมาก่อนหากคุณเกิดในโลกแห่งรหัสที่มีการจัดการ) และอันที่จริงฉันไม่เคยได้ยินมาก่อน! แล้วนี่คืออะไรความทรงจำเหยียบความทรงจำ เกิดขึ้นเมื่อใด

7
กลุ่ม NSAutoreleasePool autorelease ทำงานอย่างไร
ที่ผมเข้าใจสิ่งที่สร้างขึ้นกับalloc , ใหม่หรือสำเนาความต้องการที่จะได้รับการปล่อยตัวด้วยตนเอง ตัวอย่างเช่น: int main(void) { NSString *string; string = [[NSString alloc] init]; /* use the string */ [string release]; } คำถามของฉันมันจะไม่ถูกต้องเท่านี้หรือ: int main(void) { NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; NSString *string; string = [[[NSString alloc] init] autorelease]; /* use the string */ [pool drain]; }

9
เมื่อคุณออกจากแอปพลิเคชัน C หน่วยความจำ malloc-ed จะถูกปลดปล่อยโดยอัตโนมัติหรือไม่?
สมมติว่าฉันมีรหัส C ต่อไปนี้: int main () { int *p = malloc(10 * sizeof *p); *p = 42; return 0; //Exiting without freeing the allocated memory } เมื่อฉันรวบรวมและดำเนินการโปรแกรม C นั้นเช่นหลังจากจัดสรรพื้นที่ในหน่วยความจำแล้วหน่วยความจำที่ฉันจัดสรรจะยังคงได้รับการจัดสรร (กล่าวคือใช้พื้นที่ว่าง) หลังจากที่ฉันออกจากแอปพลิเคชันและกระบวนการสิ้นสุดลงหรือไม่

10
ฉันจะสร้าง "ตัวเว้นวรรค" ในโครงสร้างหน่วยความจำคลาส C ++ ได้อย่างไร
ปัญหา ในบริบทฝังโลหะเปลือยระดับต่ำฉันต้องการสร้างพื้นที่ว่างในหน่วยความจำภายในโครงสร้าง C ++ และไม่มีชื่อใด ๆ เพื่อห้ามไม่ให้ผู้ใช้เข้าถึงตำแหน่งหน่วยความจำดังกล่าว ตอนนี้ฉันทำได้สำเร็จแล้วโดยการใส่uint32_t :96;บิตฟิลด์ที่น่าเกลียดซึ่งจะแทนที่สามคำได้อย่างสะดวก แต่มันจะขึ้นคำเตือนจาก GCC (Bitfield ใหญ่เกินไปที่จะใส่ใน uint32_t) ซึ่งค่อนข้างถูกต้อง แม้ว่าจะใช้งานได้ดี แต่ก็ไม่ค่อยสะอาดนักเมื่อคุณต้องการแจกจ่ายห้องสมุดที่มีคำเตือนหลายร้อยคำ ... ฉันจะทำอย่างถูกต้องได้อย่างไร? เหตุใดจึงมีปัญหาตั้งแต่แรก โครงการที่ฉันกำลังดำเนินการประกอบด้วยการกำหนดโครงสร้างหน่วยความจำของอุปกรณ์ต่อพ่วงต่างๆของสายไมโครคอนโทรลเลอร์ทั้งหมด (STMicroelectronics STM32) ในการทำเช่นนั้นผลลัพธ์คือคลาสที่มีการรวมกันของโครงสร้างต่างๆซึ่งกำหนดการลงทะเบียนทั้งหมดขึ้นอยู่กับไมโครคอนโทรลเลอร์เป้าหมาย ตัวอย่างง่ายๆสำหรับอุปกรณ์ต่อพ่วงที่เรียบง่ายมีดังต่อไปนี้: อินพุต / เอาท์พุตวัตถุประสงค์ทั่วไป (GPIO) union { struct { GPIO_MAP0_MODER; GPIO_MAP0_OTYPER; GPIO_MAP0_OSPEEDR; GPIO_MAP0_PUPDR; GPIO_MAP0_IDR; GPIO_MAP0_ODR; GPIO_MAP0_BSRR; GPIO_MAP0_LCKR; GPIO_MAP0_AFR; GPIO_MAP0_BRR; GPIO_MAP0_ASCR; }; struct { GPIO_MAP1_CRL; GPIO_MAP1_CRH; GPIO_MAP1_IDR; …

6
เมื่อใดที่ฉันควรใช้ malloc ใน C และเมื่อใดที่ไม่ควรใช้
ฉันเข้าใจวิธีการทำงานของ malloc () คำถามของฉันคือฉันจะเห็นสิ่งนี้: #define A_MEGABYTE (1024 * 1024) char *some_memory; size_t size_to_allocate = A_MEGABYTE; some_memory = (char *)malloc(size_to_allocate); sprintf(some_memory, "Hello World"); printf("%s\n", some_memory); free(some_memory); ฉันละเว้นการตรวจสอบข้อผิดพลาดเพื่อความกะทัดรัด คำถามของฉันคือคุณไม่สามารถดำเนินการข้างต้นโดยการเริ่มต้นตัวชี้ไปยังที่จัดเก็บแบบคงที่ในหน่วยความจำได้หรือไม่? บางที: char *some_memory = "Hello World"; ณ จุดใดที่คุณต้องจัดสรรหน่วยความจำด้วยตัวคุณเองแทนที่จะประกาศ / เริ่มต้นค่าที่คุณต้องเก็บไว้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.