Java Heap คืออะไร
จากบทความก่อนหน้านี้เราทราบไปแล้วว่า Java คืออะไร และ JVM คืออะไร ที่นี้เรามาต่อในหน่วยย่อยของ JVM ซึ่งคือ Java Heap นั่นเอง และก่อนที่เราจะอธิบายถึงความหมายของ Java Heap คืออะไร เรามาทำความรู้จักกับหน่วยความจำ หรือ memory ที่ Java ใช้งานกันใน Java virtual machine ก่อน
จากรูปจะเห็นส่วนประกอบ memory ที่ JVM ใช้งานแบ่งออกเป็น กลุ่มหลักๆดังนี้
- Heap Memory ทำหน้าที่เก็บส่วนของตัวแปร java objects
- Non-Heap Memory ใช้เก็บส่วนของ java class และส่วนของ meta-data
- JVM code เก็บข้อมูลส่วนของ profile ภายในโครงสร้าง JVM เอง
Heap Memory
JVM เองจะมีการสร้าง heap memory ขึ้นมาตั้งแต่เริ่ม run program สำหรับข้อมูลพวก class instances ตัวแปร และ array ของ JVM ที่ทำการ load ขึ้นเพื่อใช้งาน และสามารถกำหนดขนาดหรือ size ได้จาก JVM option ดังนี้
- -Xmx<size> – ตั้งค่าสูงสุดของ Java heap size
- -Xms<size> – ตั้งค่าเริ่มต้นของ Java heap size
โดยปกติแล้วค่าสูงสุดจะตั้งไว้ที่ 64 Mb ซึ่ง heap memory เองจะมีการ clear ค่าเพื่อนำกลับมาใช้ใหม่เรื่อยๆด้วย process garbage collector หรือ gc โดยขนาดของ heap เองสามารถมีได้ทั้งขนาดตายตัว หรือ ขยายเองเรื่อยๆตามการใช้งาน จึงมีลักษณะตามชื่อเรียกคือ Heap memory หรือ กองหน่วยความจำ
ในส่วนของ Java Heap จะมีส่วนประกอบย่อยดังนี้
1. Young generation
ใช้งานในส่วน Heap กว่า 40% เป็น Eden Space ที่ใช้เก็บค่าของ object ที่ถูกกำหนด และส่วนมากจะถูก clear อย่างรวดเร็วด้วย minor gabage collector ซึ่ง object ใหม่ๆที่สร้างขึ้นภายใต้ java method จะถูกเก็บใน Eden space นี่แหละ แต่สำหรับ object ที่ยังคงใช้งานต่อเนื่องจะถูกย้ายไปอยู่ survivor space หรือ old generation
สำหรับ survivor space คือ memory ส่วนที่เหลือจาก heap และรอดจากการทำ garbage collection บน Eden space เราสามารถกำหนดค่าได้จาก -XX:Survivor เช่น Ratio=6 ซึ่งมันคืออัตราส่วนของ Survivor Space และ Eden เป็น 1:6 โดยถ้า survivor space มีค่าเล็กเกินไปก็จะมีการย้ายไปลงในส่วน tenured generation (old generation)
2. Old generation (Tenured)
Pool memory นี้จะเก็บ object ที่สร้างขึ้นบน survivor space บางช่วงเวลา และมีการใช้งานบ่อยครั้ง จะถูกย้ายมาเก็บบน Tenured generation หรือ old generation นี้เพื่อใช้งานโดน application ตลอดการทำงาน
Non-Heap Memory (PermGen)
นอกจาก JVM จะมี heap แล้ว ก็จะมีส่วนของ PermGen หรือ non-heap memory ด้วย ซึ่งเริ่มทำการจองตั้งแต่เริ่มสร้าง JVM เพื่อเก็บค่าของโครงสร้าง class ต่างๆเช่น pool ของค่าคงที่ หรือ method ต่างๆที่ code ใช้งาน ซึ่งถ้าพบการทำงานของ non-heap ที่ผิดปกติเช่น ขนาดของ memory ที่สูงเกินไป ต้องทำการตรวจสอบดังนี้
- ถ้ามีปัญหาเรื่องการ load class จนทำให้เกิด memory leak ต้องตรวจสอบจาก class loader
- ถ้ามีการสร้างตัวแปร string มากผิดปกติ ต้องตรวจสอบเรื่อง object allocation ที่ใช้งาน
ถ้า application ที่ใช้งานต้องการ non-heap memory ขนาดใหญ่กว่าปกติที่ 64 Mb เราสามารถทำการขยายค่า memory สูงสุดได้จาก JVM option -XX:MaxPermSize=<Memory> เช่น -XX:MaxPermSize=128m
Author: Suphakit Annoppornchai
Credit: https://saixiii.com, http://all-about-java-and-weblogic-server.blogspot.com
[…] application จะอาศัยหน่วยความจำ หรือ Heap memory เป็นที่เก็บข้อมูล object […]