Tìm hiểu kiến trúc bộ nhớ JVM

Tối ưu hóa mã trong Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

JVM là gì?

  • Môi trường thực thi đa nền tảng
  • Chuyển bytecode (.class) thành mã máy
  • Quản lý bộ nhớ và dọn rác
  • Biên dịch Just-In-Time
Tối ưu hóa mã trong Java

Tổng quan kiến trúc bộ nhớ JVM

Kiến trúc bộ nhớ JVM

Tối ưu hóa mã trong Java

Bộ nhớ Stack

  • Vùng nhớ cho thực thi phương thức và biến cục bộ
  • Cấu trúc LIFO (vào sau ra trước)
  • Lưu:
    • Biến cục bộ
    • Kiểu dữ liệu nguyên thủy
    • Thông tin lời gọi phương thức
  • StackOverflowError nếu vượt kích thước
Tối ưu hóa mã trong Java

Bộ nhớ Heap

  • Lưu mọi đối tượng và mảng
  • new tạo đối tượng và cấp phát trên heap
  • Do bộ gom rác quản lý
  • Kích thước động
  • Chia theo thế hệ
Tối ưu hóa mã trong Java

Bộ nhớ trong thực tế

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 }
Tối ưu hóa mã trong Java

Mẫu mã hóa tiết kiệm bộ nhớ

// 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);
}
Tối ưu hóa mã trong Java

Tóm tắt

  • JVM quản lý bộ nhớ chủ yếu qua stack và heap
  • Stack: nhanh, lưu kiểu nguyên thủy và tham chiếu
  • Heap: lưu đối tượng
Tối ưu hóa mã trong Java

Ayo berlatih!

Tối ưu hóa mã trong Java

Preparing Video For Download...