1. Java Development Kit (JDK)
Là bộ công cụ dành cho người phát triển ứng dụng bằng ngôn ngữ lập trình Java, bao gồm JRE và các công cụ hỗ trợ phát triển phần mềm (ví dụ như: trình biên dịch, trình thông dịch, trình sửa lỗi…). Mã nguồn trong file .java sẽ được trình biên dịch biển đổi thành file .class để thực thi trong JRE.
2. Java Runtime Environment (JRE)
JRE là bộ cài đặt để thực thi chương trình viết bằng ngôn ngữ Java. JRE chứa JVM, các tập tin .class, và các tập tin hỗ trợ khác. Để chạy một chương trình java, bạn cần phải có JRE cài đặt trong hệ thống.
3. Java SE API
Java SE API là tập hợp các gói thư viện viết sẵn nằm trong JRE, hỗ trợ cho người phát triển phần mềm viết bằng ngôn ngữ Java.
4. Java Virtual Machine
Java Virtual Machine (JVM) là công cụ thực thi mã (Java bytecode) trong tập tin .class của nền tảng Java. Nhờ có JVM nên chương trình viết bằng Java có thể triển khai trên nhiều hệ điều hành khác nhau (Windows, Linux, Mac…) dành cho nhiều loại phần cứng khác nhau. JVM có các tính năng như:
Thực thi mã trong tập tin .class
Tự động xử lý ngoại lệ
Cung cấp thông tin (log) để gỡ rối lỗi phần mềm
Thực thi mã trong tập tin .class
Tự động xử lý ngoại lệ
Cung cấp thông tin (log) để gỡ rối lỗi phần mềm
5. Bộ nhớ trong Java
Khi thực hiện cấp phát bộ nhớ, một đối tượng mới được tạo và đặt vào vùng nhớ Heap. Khi ứng dụng của bạn không còn tham chiếu tới đối tượng này nữa thì Java garbage collector cho phép xóa đối tượng này đi để sử dụng lại vùng nhớ đó.
a. Java Heap
JVM lưu tất cả đối tượng được tạo bởi toán tử “new” trong ứng dụng Java, vào vùng nhớ Heap tại thời điểm chạy.
b. Java Stack
a. Java Heap
JVM lưu tất cả đối tượng được tạo bởi toán tử “new” trong ứng dụng Java, vào vùng nhớ Heap tại thời điểm chạy.
b. Java Stack
Các phương thức và tham chiếu tới đối tượng địa phương được lưu trữ trong Stack. Mỗi Thread quản lý một stack. Khi phương thức được gọi, nó được đưa vào đỉnh của Stack. Stack lưu trữ trạng thái của phương thức bao gồm: dòng code thực thi, tham chiếu tới đối tượng địa phương. Khi phương thức chạy xong, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) được đẩy ra khỏi stack và tự động giải phóng.
c. Java Perm
Lưu trữ thông tin của Class được nạp vào và một vài tính năng khác như StringPool (vùng nhớ của biến String) thường được tạo bởi phương thức String.interm(). Khi ứng dụng của bạn chạy, Perm space được lấp đầy nhanh chóng.
c. Java Perm
Lưu trữ thông tin của Class được nạp vào và một vài tính năng khác như StringPool (vùng nhớ của biến String) thường được tạo bởi phương thức String.interm(). Khi ứng dụng của bạn chạy, Perm space được lấp đầy nhanh chóng.
6. Phân biệt Heap, Stack, Perm
Heap: lưu đối tượng
Stack: lưu tham chiếu tới đối tượng địa phương
Perm: lưu thông tin về Class được nạp vào
Ví dụ: Student std = new Student();
Heap: lưu đối tượng “new Student();”
Stack: lưu tham chiếu “std”
Perm: lưu thông tin về Class “Student”
Stack: lưu tham chiếu tới đối tượng địa phương
Perm: lưu thông tin về Class được nạp vào
Ví dụ: Student std = new Student();
Heap: lưu đối tượng “new Student();”
Stack: lưu tham chiếu “std”
Perm: lưu thông tin về Class “Student”
7. Garbage Collector
Garbage Collector của JVM làm nhiệm vụ tự động thực hiện thu hồi vùng nhớ của các đối tượng trong bộ nhớ Heap khi nó không được tham chiếu đến.
Tham khảo tối ưu bộ nhớ cho JVM:
Tham khảo tối ưu bộ nhớ cho JVM:
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
8. Trình biên dịch Just-in-time (JIT) (thông dịch)
Trình biên dịch JIT thực hiện biên dịch mã Java bytecode trong file .class sang mã thực thi tại thời điểm chạy. Việc này làm cho chương trình chạy chậm hơn. Vì thế nó còn được gọi là “Hot spot”.
9. Java Classloader
Java Classloader là một phần của JRE làm nhiệm vụ tự động nạp các class Java vào JVM.
Khi khởi động JVM, 3 class loader được sử dụng :
Bootstrap class loader : nạp thư viện lõi Java (/jre/lib)
Extensions class loader : nạp thư viện mở rộng (/jre/lib/ext)
System class loader : nạp thư viện trong java.class.path (CLASSPATH)
Khi khởi động JVM, 3 class loader được sử dụng :
Bootstrap class loader : nạp thư viện lõi Java (/jre/lib)
Extensions class loader : nạp thư viện mở rộng (/jre/lib/ext)
System class loader : nạp thư viện trong java.class.path (CLASSPATH)
JAR hell là một thuật ngữ mô tả việc nạp thư viện JAR không theo ý muốn. JAR hell xảy ra trong 3 trường hợp:
– Nạp 2 phiên bản của một thư viện có sẵn cho hệ thống. Việc này không gây ra lỗi, thay vào đó hệ thống nạp các lớp từ một hoặc các thư viện khác để thay thế.
– 2 thư viện (hoặc 1 thư viện và ứng dụng) yêu cầu phiên bản khác nhau của một thư viện thứ 3. Nếu 2 phiên bản của thư viện thứ 3 trùng tên class thì class loader không thể nạp được class đó.
– Các lớp được nạp bởi các class loader khác nhau có thể tương tác theo những cách phức tạp mà người phát triển phần mềm không hiểu được, dẫn đến những lỗi không thể giải thích.
– Nạp 2 phiên bản của một thư viện có sẵn cho hệ thống. Việc này không gây ra lỗi, thay vào đó hệ thống nạp các lớp từ một hoặc các thư viện khác để thay thế.
– 2 thư viện (hoặc 1 thư viện và ứng dụng) yêu cầu phiên bản khác nhau của một thư viện thứ 3. Nếu 2 phiên bản của thư viện thứ 3 trùng tên class thì class loader không thể nạp được class đó.
– Các lớp được nạp bởi các class loader khác nhau có thể tương tác theo những cách phức tạp mà người phát triển phần mềm không hiểu được, dẫn đến những lỗi không thể giải thích.
Để tránh Java hell bạn thực hiện cấu hình Compile-time libraries của các IDE. Ví dụ đối với Netbean thực hiện đẩy các gói thư viện .jar bạn muốn ưu tiên lên phía trên.
10. Phương thức main trong Java
JVM khởi động bằng cách gọi phương thức main của lớp cụ thể nào đó.Tức là:
Tất cả các chương trình Java đều khởi động từ phương thức main. Một JVM chỉ chạy duy nhất một chương trình java và luôn bắt đầu bằng việc gọi phương thức main() của chương trình đó.
Phương thức main là điểm đầu vào duy nhất của một chương trình Java vì thế nó phải là phương thức static.
Vậy phương thức main của một ứng dụng web Java nằm ở đâu?
Nằm trong web container ví dụ web container là Tomcat thì phương thức main nằm trong $CATALINA_HOME/bin/bootstrap.jar
Khi nào trên Task Manager của hệ điều hành Window hiển thị process Java.exe?
Khi một JVM được gọi, tức là khi phương thức main của chương trình java được gọi. Cần lưu ý đối với các ứng dụng chạy applet ví dụ ứng dụng xem văn bản PDF , cần tránh tạo ra quá nhiều process Java.exe trên Window vì mỗi lần khởi tạo JVM, Window phải cấp phát tài nguyên cho nó.
/* Đỗ Minh Hiền */
Bình luận