Nội dung
Java virtual machine là gì?
Được viết tắt là JVM – một trong những yếu tố quan trọng nhất của ngôn ngữ lập trình. Sử dụng để thực thi các chương trình Java hay còn gọi là trình thông dịch Java. Code Java sẽ được cung cấp môi trường để thực thi.
Khi biên dịch thì chương trình Java sẽ tạo ra các mã bytecodes. Nếu như hệ điều hành chạy chương trình ứng với một mã máy khác thì đó chính là mã bytecodes.
Ví dụ: Windows thì sẽ được biên dịch dưới dạng exe, Linux dưới dạng .ELF
Mục đích chính của Java virtual machine
- Mã Java được dịch ra mã máy để có thể chạy trên các hệ điều hành khác
- Tăng tốc độ
- Tính bảo mật được tăng cường và tránh source code bị virus
Tại sao cần phải sử dụng virtual trong Java?
Chính là phương tiện để ngôn ngữ lập trình Java có thể chạy ở nhiều môi trường khác nhau. Ngoài ra, virtual machine trong java cũng có khả năng duy trì và tối ưu hóa bộ nhớ chương trình. Trước đây, các chương trình chỉ chạy trên một nền tảng cụ thể nào đó, còn đối với code java thì tương thích với đa nền tảng và hầu hết các hệ điều hành khác nhau.
Có hai luồng hiểu về JVM đối với người dùng:
Thứ nhất, java virtual machine là chương trình phần mềm cung cấp môi trường cho code java thực hiện.
Thứ hai, java virtual machine được sử dụng cài đặt cấu hình nhằm kiểm soát và quản lý tài nguyên java trong quá trình thực hiện.
Kiến trúc của JVM
Java được cấu tạo từ nhiều bộ phận khác nhau tương tự như những ngôn ngữ lập trình khác. Những kiến trúc cơ bản ảnh hưởng tới cách thức Java hoạt động:
- Hệ thống phụ của JVM là Classloader, có chức năng tìm kiếm và tải file
- Lưu trữ các cấu trúc lớp với các type khác nhau để chạy chương trình Java là Method Area
- Bộ nhớ lưu giữ Object, biến đối tượng liên quan và mảng (Array) là Heap
- JVM language Stacks được sử dụng để lưu trữ các biến cục bộ. Tất cả các luồng sẽ có JVM stacks riêng và được tạo ra cùng thời điểm luồng.
- Địa chỉ của các JVM đang thực thi lệnh của PC register. Với ngôn ngữ Java mỗi luồng sẽ có PC register riêng.
- Native Method Stack bằng cách sử dụng thư viện gốc đã được lưu trữ các lệnh của code gốc và viết bằng nhiều ngôn ngữ khác nhau ngoài Java.
- Execution Engine được xem như một phần mềm dùng để kiểm tra phần mềm, phần cứng, hoặc hệ thống hoàn chỉnh.
- Native Method interface là Framework cho phép code Java chạy trong Java virtual machine (JVM).
- Native Methods Libraries là tập hợp bao gồm các thư viện riêng: C, C ++ nhằm phục vụ cho Execution Engine (công cụ thực thi).
Quá trình thực hiện và biên dịch mã phần mềm
Tước hết, để có thể viết và thực hiện chương trình phần mềm thì bạn cần những điều sau đây:
- Editor – Có thể sử dụng notepad cho trình biên dịch, để nhập chương trình vào
- Compiler – Để chuyển đổi chương trình ngôn ngữ cao thành mã máy gốc
- Linker – Để kết hợp mọi tệp khác nhau trong chương trình chính với nhau.
- Loader – Để tải các tệp từ thiết bị lưu trữ thứ cấp như: Đĩa cứng, Flash Drive, CD vào RAM để thực hiện. Khi thực hiện mã thì việc tải sẽ theo hình thức tự động.
- Execution – Thực hiện mã được xử lý bởi hệ điều hành & bộ xử lý.
Cơ chế thực hiện
- Classloader tìm và load các file .class sau đó file này sẽ được máy ảo JVM( Java virtual machine), bộ nhớ sẽ được cung cấp.
- Class (Method) area: đây được gọi là vùng nhớ cấp phát cho class (Method). Thông thường được phân chia thành các heap, stack, PC register, native method stack
- Heap: Đây là nơi các dữ liệu thời gian chạy trong đó mọi đối tượng được phân bổ.
- Stack : Tham chiếu các phương thức tới đối tượng được lưu trữ trong Stack. Mỗi Thread thì sẽ quản lý một stack. Khi được gọi thì các phương thức sẽ đưa vào đỉnh của Stack. Trạng thái của phương thức sẽ được lưu trữ tại đây bao gồm: code thực thi, tham chiếu tới đối tượng địa phương. Sau khi chạy trong phương thức, vùng nhớ (dòng code thực thi, tham chiếu tới đối tượng địa phương) sẽ được đẩy ra khỏi stack và tự động giải phóng.
- PC register (Program Counter Register): chứa địa chỉ của các máy ảo Java hướng dẫn hiện đang được thực hiện.
- Native Method Stack: bao gồm tất cả các method native trong một chương trình
- Execution Engine: bao gồm bộ xử lý ảo, một phiên dịch để đọc dòng bytecode. Tiếp theo là thực hiện theo hướng dẫn và cuối cùng sẽ là trình biên dịch Just-In-Time (JIT). JIT thực hiện nhiệm vụ biên dịch các phần của mã byte có chức năng tương tự trong cùng một lúc. Cũng bởi vậy mà làm giảm số lượng thời gian cần thiết cho compilation.
Biên dịch và thực hiện mã trong Java virtual machine
Trong main có hai method là f1 và f2, được thể hiện như sau:
Lỗi của Java virtual machine
Khi xuất hiện lỗi JVM thì máy tính sẽ không thể đọc và hiểu code Java. Một trong những lỗi thường gặp nhất trong quá trình khởi chạy JVM đó là do các thành phần bắt buộc không có sẵn. Ví dụ như khi bắt đầu khởi động có một lớp bắt buộc nào đó không xuất hiện thì JVM sẽ lập tức báo lỗi để cảnh báo tới người dùng. Lỗi này sẽ được minh họa trong hình ảnh dưới dây:
Tổng kết
Trên đây là những kiến thức và thông tin cụ thể về Java Virtual Machine (JVM). Hy vọng thông qua bài viết trên bạn đã có cái nhìn đơn giản và hiểu biết về Java virtual machine là gì? Những ứng dụng nó hiệu quả trong lập trình. Nếu bạn có thắc mắc về Java Virtual Machine (JVM) hay muốn tìm hiểu thêm về những kiến thức liên quan đến máy ảo, hãy để lại ở bên bình luận bên dưới, CodeGym Hà Nội sẽ hỗ trợ, phản hồi bạn trong thời gian sớm nhất.
Bạn cũng có thể truy cập tại đây của CodeGym Hà Nội để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công!
0 Lời bình