0Pricing
Go Academy · บทเรียน

การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ

ค้นหาจุดที่ใช้หน่วยความจำสูงด้วยโปรไฟล์ฮีป

การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องสร้างโพรไฟล์ฮีป

การจัดสรรหน่วยความจำมากเกินไปทำให้โปรแกรม Go ช้าลงเนื่องจากแรงกดดันต่อ GC การสร้างโพรไฟล์ฮีปจะแสดงว่าเส้นทางโค้ดใดจัดสรรหน่วยความจำมากที่สุด เพื่อให้คุณลดการจัดสรรลงได้

การเก็บโพรไฟล์ฮีป

ผ่านปลายทาง HTTP (ต้องใช้ net/http/pprof):

go tool pprof http://localhost:6060/debug/pprof/heap

โพรไฟล์ฮีปแบบใช้ไฟล์

เขียนโพรไฟล์ฮีปเมื่อใดก็ได้โดยใช้ runtime/pprof:

f, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(f)
f.Close()

Inuse เทียบกับ alloc

โพรไฟล์ฮีปมีมุมมองสองแบบ: inuse_objects/inuse_space (ที่ยังใช้งานอยู่ในปัจจุบัน) และ alloc_objects/alloc_space (ทั้งหมดนับตั้งแต่เริ่มต้น) ใช้ alloc_space เพื่อค้นหาเส้นทางการจัดสรรที่เป็นจุดร้อน

go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap

go test -memprofile

เก็บโพรไฟล์หน่วยความจำระหว่างการวัดประสิทธิภาพ:

go test -memprofile mem.prof -benchmem -bench=BenchmarkProcess ./...

MemStats

อ่านสถิติหน่วยความจำของรันไทม์ด้วยโปรแกรมเพื่อใช้ในการตรวจสอบแบบเรียลไทม์:

var ms runtime.MemStats
runtime.ReadMemStats(&ms)
fmt.Printf("Alloc: %v MiB\n", ms.Alloc/1024/1024)
fmt.Printf("NumGC: %v\n", ms.NumGC)

การวิเคราะห์การหลบหนี

ตัวแปรที่หลบหนีไปยังฮีปจะทำให้เกิดการจัดสรรหน่วยความจำ เรียกใช้ go build -gcflags=-m เพื่อดูว่าตัวแปรใดหลบหนีและเพราะเหตุใด

go build -gcflags="-m -m" ./...
// main.go:12:15: &User{...} escapes to heap

การลดการจัดสรร: จัดสรรล่วงหน้า

จัดสรรสไลซ์ล่วงหน้าด้วย make([]T, 0, n) เมื่อทราบความยาวสุดท้ายแล้ว เพื่อหลีกเลี่ยงการจัดสรรใหม่ซ้ำ ๆ ขณะที่สไลซ์ขยายตัว

results := make([]Result, 0, len(input))

sync.Pool สำหรับการนำกลับมาใช้ใหม่

จัดเก็บอ็อบเจ็กต์ที่นำกลับมาใช้ใหม่ได้ เช่น บัฟเฟอร์และสไลซ์ชั่วคราว ด้วย sync.Pool เพื่อเฉลี่ยต้นทุนการจัดสรร:

var pool = sync.Pool{
    New: func() any { return new(bytes.Buffer) },
}
buf := pool.Get().(*bytes.Buffer)
buf.Reset()
// use buf...
pool.Put(buf)

ตัวรับค่าเทียบกับตัวรับพอยน์เตอร์

สตรักต์ขนาดใหญ่ที่ส่งด้วยค่า จะถูกคัดลอกทุกครั้งที่เรียกใช้ ให้ส่งด้วยพอยน์เตอร์เพื่อหลีกเลี่ยงการคัดลอก แต่โปรดทราบว่าพอยน์เตอร์อาจทำให้ค่าหลบหนีไปยังฮีป

String เทียบกับ []byte

การแปลงระหว่างสตริงกับ []byte ทำให้เกิดการจัดสรรหน่วยความจำ ใช้ []byte ตลอดเส้นทางที่เป็นจุดร้อน และแปลงเป็นสตริงเฉพาะที่ขอบเขตซึ่งจำเป็นต้องใช้สตริงเท่านั้น

ตรวจสอบความเข้าใจ

-alloc_space แสดงอะไรในโพรไฟล์ฮีปของ pprof

สรุป: การสร้างโพรไฟล์ฮีป

ประเด็นสำคัญ:

  • -alloc_space แสดงการจัดสรรทั้งหมด ส่วน inuse_space แสดงหน่วยความจำที่ยังใช้งานอยู่
  • go build -gcflags=-m แสดงการวิเคราะห์การหลบหนี
  • จัดสรรสไลซ์ล่วงหน้า และใช้ sync.Pool สำหรับการนำกลับมาใช้ใหม่บ่อย ๆ
  • ใช้ runtime.ReadMemStats สำหรับการตรวจสอบด้วยโปรแกรม

คำถามที่พบบ่อย

บทเรียน “การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ”

ค้นหาจุดที่ใช้หน่วยความจำสูงด้วยโปรไฟล์ฮีป คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนการทดสอบประสิทธิภาพด้วย testing.B
  2. การทำโปรไฟล์ CPU ด้วย pprof
  3. การทำโปรไฟล์ฮีปและการจัดสรรหน่วยความจำ
  4. การติดตามการทำงาน
← กลับไปที่ Go Academy