理解 JVM 記憶體架構

Java 程式碼最佳化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

什麼是 JVM?

  • 平台無關的執行環境
  • 將位元組碼(.class)轉為機器碼
  • 記憶體管理與垃圾回收
  • 即時編譯(JIT)
Java 程式碼最佳化

JVM 記憶體架構總覽

JVM 記憶體架構

Java 程式碼最佳化

Stack 記憶體

  • 方法執行與區域變數的記憶體區
  • LIFO(先進後出)結構
  • 儲存:
    • 區域變數
    • 基本型別
    • 方法呼叫資訊
  • 超出大小會拋出 StackOverflowError
Java 程式碼最佳化

Heap 記憶體

  • 儲存所有物件與陣列
  • 使用 new 建立物件並配置於 heap
  • 由垃圾回收器管理
  • 動態大小
  • 依世代劃分
Java 程式碼最佳化

記憶體運作示例

public void processData() {
    int count = 0;                  // Stack

String name = "Java"; // Heap
List<String> items = // Reference on Stack new ArrayList<>(); // Object on Heap
items.add(new String("Item")); // Object on Heap }
Java 程式碼最佳化

節省記憶體的程式寫法

// Inefficient
List<String> list1 = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    String s = new String("value"); // 1000 objects
    list1.add(s);
}

// Better
List<String> list2 = new ArrayList<>();
String s = "value";  // Single object
for (int i = 0; i < 1000; i++) {
    list2.add(s);
}
Java 程式碼最佳化

重點總結

  • JVM 主要透過 stack 與 heap 管理記憶體
  • Stack:快速,儲存基本型別與參考
  • Heap:儲存物件
Java 程式碼最佳化

一起來練習吧!

Java 程式碼最佳化

Preparing Video For Download...