Đặc điểm và Cơ chế Hoạt động của Java và JVM

Đặc điểm Ngôn ngữ Java

Java hỗ trợ lập trình hướng đối tượng với ba nguyên lý: đóng gói, kế thừa và đa hình. Tính độc lập nền tảng đạt được thông qua máy ảo JVM, còn độ tin cậy được đảm bảo bằng cơ chế quản lý ngoại lệ và tự động giải phóng bộ nhớ. Tệp mã nguồn .java được biên dịch thành bytecode .class, sau đó JVM tải và thực thi từng dòng lệnh thông qua trình thông dịch.

So sánh Java và C++

Java chỉ hỗ trợ đơn kế thừa lớp nhưng cho phép đa kế thừa giao diện, khác với C++ hỗ trợ đa kế thừa trực tiếp. Java tích hợp cơ chế tự động thu gom rác (GC) thay vì yêu cầu lập trình viên quản lý bộ nhớ thủ công, đồng thời loại bỏ con trỏ để tăng tính an toàn.

Kiểu dữ liệu Nguyên thủy và Wrapper

Java cung cấp 8 kiểu dữ liệu nguyên thủy:

  • byte, short, int, long (số nguyên)
  • float, double (số thực)
  • char (ký tự)
  • boolean (logic)

Lớp wrapper tương ứng: Byte, Short, Integer, Long, Float, Double, Character, Boolean. Cơ chế cache tự động áp dụng cho giá trị phổ biến (vd: Integer cache [-128,127]).

Autoboxing/Unboxing

Autoboxing tự động chuyển kiểu nguyên thủy sang wrapper thông qua valueOf(), trong khi unboxing dùng phương thức như intValue() để chuyển ngược lại.

Biến Thành viên và Cục bộ

Tiêu chí Biến thành viên Biến cục bộ
Phạm vi Toàn lớp Trong phương thức/khối
Bộ nhớ Heap (khi không static) Stack
Giá trị mặc định Không

Quản lý Bộ nhớ JVM

Cấu trúc Bộ nhớ

  • Vùng chia sẻ:
    • Heap: Lưu đối tượng, chia thành Young Generation (Eden, Survivor) và Old Generation
    • Metaspace: Lưu metadata lớp (Java 8+)
  • Vùng riêng thread:
    • Stack: Quản lý lệnh và biến cục bộ
    • Bộ đếm chương trình (PC Register)
    • Native Method Stack

Thuật toán Thu gom Rác

Xác định đối tượng rác bằng phân tích đạt tới (GC Roots). Các thuật toán chính:

  • Copying: Dùng cho Young Generation, hiệu quả với đối tượng ngắn hạn
  • Mark-Sweep-Compact: Dùng cho Old Generation, xử lý phân mảnh bộ nhớ

Bộ Thu gom Rác (GC)

  • Serial GC: Đơn luồng, STW dài
  • Parallel GC: Đa luồng, cải thiện hiệu năng
  • CMS: Thu gom đồng thời, giảm STW
  • G1: Phân vùng heap, cân bằng hiệu năng

Xử lý Ngoại lệ

Phân cấp ngoại lệ:

Throwable
├── Error (OutOfMemoryError)
└── Exception
    ├── Checked (IOException)
    └── Unchecked (NullPointerException)

Quy tắc sử dụng:

  • throw: Ném ngoại lệ trong phương thức
  • throws: Khai báo ngoại lệ tại signature
  • try-catch-finally: Xử lý và dọn dẹp tài nguyên

Cơ chế Nạp Lớp

Quy trình nạp lớp:

  1. Bootstrap ClassLoader: Tải thư viện core JDK
  2. Extension ClassLoader: Tải lớp từ thư mục mở rộng
  3. Application ClassLoader: Tải lớp ứng dụng

Cơ chế ủy quyền kép đảm bảo lớp core chỉ được tải bởi Bootstrap Loader.

Reflection và Generics

Reflection cho phép kiểm tra và thao tác lớp tại runtime:

Class<?> clazz = Class.forName("com.example.MyClass");
Method method = clazz.getMethod("myMethod");
method.invoke(clazz.newInstance());

Generics đảm bảo kiểm tra kiểu tại compile-time:

public class Box<T> {
    private T content;
    public void set(T value) { this.content = value; }
}

Xử lý I/O

Phân loại luồng:

  • Byte Stream: InputStream/OutputStream
  • Character Stream: Reader/Writer

Sử dụng bộ đệm để tối ưu hiệu năng:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

Thẻ: Java JVM gc Autoboxing Reflection

Đăng vào ngày 19 tháng 6 lúc 21:21