Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
723,36 KB
File đính kèm
TieuLuan_JVM.zip
(22 B)
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ──────── * ─────── TIỂU LUẬN MƠN HỌC KIẾN TRÚC MÁY TÍNH TIÊN TIẾN Đề tài: TìmhiểumáyảoJavaVirtualMachine Học viên thực hiện: Nguyễn Anh Tuấn – Lớp 2017A CNTT Đỗ Thị Mai – Lớp 2017A SPKT CNTT Nguyễn Thị Thùy Dung – Lớp 2015A CNTT Giáo viên hướng dẫn: TS Nguyễn Kim Khánh HÀ NỘI 12-2017 MỤC LỤC I TỔNG QUAN VỀ MÁYẢOJAVA Khái niệm máyảoJava .4 Quy trình thực thi chương trình Java Kiến trúc JVM 3.1 Thành phần tải lớp 3.2 Vùng liệu thời gian chạy 3.3 Máy thực thi II THÀNH PHẦN TẢI LỚP Tổng quan lệnh dẫn JVM .8 1.1 Các kiểu liệu máyảoJava 1.2 Lệnh load store 1.3 Lệnh số học 10 1.4 Lệnh chuyển đổi kiểu liệu .10 1.5 Tạo thao tác với đối tượng .11 1.6 Lệnh quản lý operand stack .11 1.7 Lệnh điều khiển 11 1.8 Lệnh gọi trả phương thức 11 1.9 Xử lý ngoại lệ .12 Cấu trúc dạng file class .12 2.1 Constant pool .15 2.2 Trường phương thức: .17 2.3 Thuộc tính (Attribute) 18 Tải lớp, liên kết khởi tạo (Loading, Linking and Initializing) .19 3.1 Tải lớp (Loading) .19 3.2 Liên kết (Linking) 20 3.3 Khởi tạo 21 III KHU VỰC DỮ LIỆU THỰC THI 23 Khu vực liệu thực thi 23 1.1 Ngăn xếp JVM 23 1.2 Khu vực phương thức (Method Area) 23 1.3 Khu vực Heap (Heap Area) 23 1.4 Thanh ghi PC (PC Register) .23 1.5 Ngăn xếp phương thức native .23 Khung ngăn xếp 23 2.1 Các biến địa phương 24 2.2 Ngăn xếp toán hạng .25 IV MÁY THỰC THI 26 Bộ thông dịch bytecode .26 Bộ biên dịch JIT 27 2.1 Các chế biên dịch JVM 27 2.2 Cơ chế hoạt động biên dịch JIT .28 Bộ dọn rác 31 3.1 Khái niệm tự động quản lý vùng nhớ (Automatic memory management) 31 3.2 Các kỹ thuật thu gom rác 31 TÀI LIỆU THAM KHẢO 34 I TỔNG QUAN VỀ MÁYẢOJAVA Khái niệm máyảoJavaMáyảo Java, hay gọi JVM máy tính tốn trừu tượng cho phép máy tính chạy chương trình Java Có khái niệm liên quan tới JVM: đặc tả (specification), cài đặt (implementation) thể (instance) Đặc tả tài liệu mô tả thống thành phần cần thiết cho cài đặt JVM Một cài đặt JVM chương trình máy tính đáp ứng đầy đủ yêu cầu đặc tả JVM Một thể JVM cài đặt JVM chạy tiến trình cụ thể để thực thi chương trình máy tính (đã biên dịch sang Java bytecode) Quy trình thực thi chương trình Java Chương trình Java biên dịch Java chuyển thành dạng file có class File class thực chất dạng mã máy bao gồm mã Java bytecode thực thi máyảoJava Bởi Java bytecode không phụ thuộc vào tảng (platform independent) ứng dụng Java chạy tảng, miễn tảng có máyảoJava tương ứng Kiến trúc JVM Sơ đồ kiến trúc JVM: JVM chia làm thành phần chính: Thành phần tải lớp (Class Loader Sub-system) Vùng liệu thời gian chạy (Runtime Data Area) Máy thực thi (Execution Engine) 3.1 Thành phần tải lớp 3.1.1 Tải lớp (Loading) Các lớp chương trình tải lên thành phần này, thơng qua tải chính: tải lớp Boot Strap, tải lớp Extension, tải lớp Application Bộ tải lớp Boot Strap: làm nhiệm vụ tải lớp cần thiết để khởi động chương trình Bộ tải lớp Extension: làm nhiệm vụ tải lớp mở rộng thư mục jre/lib/ext Bộ tải lớp Application: làm nhiệm vụ tải lớp thuộc tầng ứng dụng 3.1.2 Liên kết (Linking) Bước liên kết thực bao gồm: Xác thực (Verify): Bộ xác thực bytecode kiểm tra nội dung mã bytecode sinh có chuẩn hay khơng Trong trường hợp xác thực thất bại, ta nhận thông báo lỗi xác thực Chuẩn bị (Prepare): Tất biến tĩnh (static variables) khởi tạo gán giá trị mặc đinh Phân giải (Resolve): Các tham chiếu vùng nhớ biểu tượng (symbolic memory reference) thay tham chiếu nguyên (original reference) khu vực phương thức (Method area) 3.1.3 Khởi tạo (Initialization) Pha cuối bước tải lớp, tất biến tĩnh gán giá trị nguyên bản, khối tĩnh (static block) thực thi 3.2 Vùng liệu thời gian chạy Vùng liệu thời gian chạy chia làm thành phần chính: Khu vực phương thức: chứa tất liệu mức lớp, bao gồm biến tĩnh Mỗi JVM có khu vực phương thức, khu vực coi tài nguyên chia sẻ Khu vực Heap: Tất đối tượng thể tương ứng chúng mảng lưu trữ Mỗi JVM có khu vực Heap Khu vực ngăn xếp: Với luồng, ngăn xếp thời gian chạy riêng biệt tạo Với lời gọi phương thức, đăng ký lưu nhớ ngăn xếp gọi khung ngăn xếp (Stack Frame) Tất biến cục lưu nhớ ngăn xếp Khung ngăn xếp chia làm thành phần: a Mảng biến cục bộ: lưu giá trị biến cục liên quan tới phương thức b Ngăn xếp tốn hạng (Operand stack): có mệnh lệnh cần thực thi lập tức, ngăn xếp tốn hạng hoạt động khơng gian thời gian chạy (runtime workspace) để thực thi mệnh lệnh c Dữ liệu khung (Frame data): lưu trữ biểu tượng liên quan tới phương thức Trong trường hợp xảy ngoại lệ (exception), thông tin khối Catch trình thành phần Bộ đăng ký PC (PC Registers): Mỗi luồng có đăng ký PC riêng biệt để lưu địa mệnh lệnh thực thi Sau mệnh lệnh thực thi xong, đăng ký PC cập nhật lệnh Ngăn xếp phương thức Native (Native method stack): thành phần chứa thông tin phương thức native Với luồng, ngăn xếp phương thức native riêng biệt tạo 3.3 Máy thực thi Các mã bytecode gán vùng liệu thời gian chạy thực thi máy thực thi Máy thực thi đọc mã bytecode thực thi mã lệnh Bộ thông dịch (Interpreter): Bộ thông dịch đọc hiểu mã bytecode tương đối nhanh, lại chậm thực thi Nhược điểm thông dịch phương thức gọi nhiều lần, lần gọi phương thức lại thơng dịch lại Bộ biên dịch JIT (JIT Compiler – Just In Time Compiler): Bộ biên dịch JIT giải nhược điểm thông dịch cách biên dịch mã bytecode thường gọi nhiều lần sang ngôn ngữ máy để thực thi trực tiếp, giúp tăng hiệu hệ thống Các thành phần biên dịch JIT o Bộ sinh mã trung gian (Intermediate Code Generator): sinh mã trung gian o Bộ tối ưu mã (Code Optimizer): tối ưu mã trung gian sinh bước o Bộ sinh mã mục tiêu (Target Code Generator): làm nhiệm vụ sinh mã native mã máy o Bộ lọc hồ sơ (Profiler): làm nhiệm vụ xác định điểm nóng (hotspot): phương thức thường xuyên gọi tới Bộ thu gom rác (Garbage Collector): thu thập giải phóng đối tượng khơng tham chiếu Giao diện Java Native (Java Native Interface – JNI): làm nhiệm vụ tương tác với thư viện Native cung cấp thư viện native cần thiết cho Máy thực thi Thư viện phương thức Native: tập thư viện native cần thiết cho Máy thực thi II THÀNH PHẦN TẢI LỚP Tổng quan lệnh dẫn JVM Một lệnh JavaVirtualMachine bao gồm byte opcode rõ phép toán thực hiện, với khơng có có nhiều tốn hạng cung cấp đối số liệu sử dụng hoạt động Nhiều lệnh khơng có tốn hạng (chỉ bao gồm opcode) Số lượng kích thước tốn hạng xác định opcode Nếu tốn hạng có kích thước nhiều byte, lưu trữ theo thứ tự big-endian byte cao xếp trước Dòng lệnh bytecode nằm byte Hai trường hợp ngoại lệ lookupswitch tableswitch giới hạn toán hạng byte 1.1 Các kiểu liệu máyảoJava Hầu hết dẫn tập lệnh JavaVirtualMachine đặt kiểu mã hóa thơng tin hoạt động thực Ví dụ, dẫn iload tải nội dung biến địa phương, mà phải số nguyên vào ngăn xếp chứa tốn hạng Hai dẫn cài đặt giống nhau, có mã opcode riêng biệt (ví dụ: dẫn iadd and fadd) Đối với phần lớn loại lệnh, kiểu liệu câu lệnh thể rõ ràng mnemonic opcode kí tự: I cho int, l cho long, s cho short, b cho byte, c cho char, f cho float, d cho double, a cho reference opcode Tipush byte short int long float doubl char reference e bipus sipus h h Tconst iconst lcons fcons dcons t t t aconst Tload iload lload fload dload aload Tstore istore lstor fstor dstor e e e astore Tinc iinc Taload baloa saloa iaload d d laloa faloa daloa caloa aaload d d d d Tastore basto sasto iastore re re lasto fasto dasto casto aastore re re re re Tadd iadd ladd fadd dadd Tsub isub lsub fsub dsub Tmul imul lmul fmul dmul Tdiv idiv ldiv Trem irem lrem frem drem Tneg ineg lneg fneg dneg Tshl ishl lshl Tshr ishr lshr Tushr iushr lushr Tand iand land Tor ior lor Txor ixor lxor i2T i2b i2s i2l l2T l2i f2T f2i f2l d2T d2i d2l Tcmp fdiv ddiv i2f i2d l2f l2d f2d d2f lcmp Tcmpl fcmp dcmp l l Tcmpg fcmp dcmp g g if_Tcmp OP if_icmp OP Treturn ireturn if_acmp OP lretu fretu dretu rn rn rn areturn Kiểu liệu tập lệnh máyảoJava Bảng tóm tắt kiểu liệu hỗ trợ tập lệnh JavaVirtualmachine Đối với lệnh cụ thể, thông tin kiểu liệu xây dựng việc thay T cột opcode ký tự cột kiểu liệu, kiêu liệu cột trống có nghĩa khơng tồn lệnh hỗ trợ kiểu liệu 1.2 Lệnh load store Lệnh load store sử dụng để chuyển giá trị local variables operand stack JVM frame (frame sử dụng để lưu trữ liệu) Lệnh load chuyển giá trị local variables vào operand stack: iload, iload_, lload, lload_, fload, fload_, dload, dload_, aload, aload_ Lệnh store chuyển giá trị từ operand stack vào local variables: istore, istore_, lstore, lstore_, fstore, fstore_, dstore, dstore_, astore, astore_ Lệnh load số vào operand stack: bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null, iconst_m1, iconst_, lconst_, fconst_, dconst_ Các lệnh truy cập tới trường đối tượng phần tử mảng sử dụng để chuyển giá trị từ đối tượng phần tử vào operand stack 1.3 Lệnh số học Lệnh số học sử dụng để tính tốn giá trị lưu trữ operand stack Có loại lệnh số học việc tính tốn giá trị integer float-point Các lệnh số học liệt kê đây: Cộng: iadd, ladd, fadd, dadd Trừ: isub, lsub, fsub, dsub Nhân: imul, lmul, fmul, dmul Chia: idiv, ldiv, fdiv, ddiv Chia lấy dư: irem, lrem, frem, drem Phủ định: ineg, lneg, fneg, dneg Dịch bit: ishl, ishr, iushr, lshl, lshr, lushr OR bit: ior, lor AND bit: iand, land XOR bit: ixor, lxor So sánh: dcmpg, dcmpl, fcmpg, fcmpl, lcmp 1.4 Lệnh chuyển đổi kiểu liệu Lệnh chuyển đổi kiểu liệu cho phép chuyển đổi kiểu liệu số học JavaVirtualMachine JVM hỗ trợ trực tiếp việc chuyển đồi từ kiểu liệu nhỏ sang kiểu liệu lớn hơn: int chuyển đổi thành long, float, double long chuyển đổi thành float or double float chuyển đổi thành double Lệnh chuyển đổi sang kiểu liệu lớn có dạng i2l, i2f, i2d, l2f, l2d, f2d Việc chuyển đổi từ kiểu int sang kiểu long kiểu int sang kiểu double không làm mát thông tin giá trị ứng với kiểu liệu trước Tuy nhiên việc chuyển đổi từ kiểu float sang kiểu double gây mát thơng tin giá trị Ngoài JVM hỗ trợ việc chuyển đổi kiểu liệu kiểu liệu nhỏ hơn: int chuyển đổi byte, short, char long chuyển đổi int float chuyển đổi int long Bộ tải Extension Bộ tải Application Để nạp lớp, máyảo cần phải thực hiện: Tên đầy đủ lớp, tạo luồng liệu nhị phân cho lớp Phân tích luồng liệu nhị phân vào cấu trúc liệu nội phương thức trống Khởi tạo lớp java.lang.class thể cho kiểu Luồng liệu nhị phân định dạng theo lớp java, thay đổi định dạng thành dạng khác Tất máyảojava phải định dạng tập tin lớp java, với triển khai cá nhân định sang kiểu khác Một số cách để tạo liệu nhị phân cho lớp: Tải tệp lớp java từ hệ thống tệp cục Tải tệp qua mạng Giải nén tệp tin java từ ZIP, JAR, CAB tệp lưu trữ khác Giải nén tệp java từ sở liệu Biên dịch file định dạng vào tệp nguồn class Các lớp nạp thơng qua trình nạp bootstrap thông qua tải người dùng định nghĩa Khi máyảo khởi động, trình nạp tải lớp interface thuộc java API, tiếp đến tải lớp thuộc chương trình 3.2 Liên kết (Linking) Liên kết bao gồm bước xác minh, chuẩn bị phân giải 3.2.1 Xác minh (Verify) Sau lớp nạp, lớp sẵn sàng để liên kết Bước trình liên kết xác thực: đảm bảo lớp tuân theo ngữ nghĩa ngôn ngữ java không vi phạm tính tồn vẹn máyảo Xác minh phần tương đối linh hoạt cài đặt máyảo java: nhà thiết kế định cách thức thời điểm để xác minh lớp Các xác minh thực bao gồm: Xác minh cấu trúc dạng file class hợp lệ Kiểm tra dẫn: o Chỉ dẫn bắt đầu với mã opcode hợp lệ? o Nếu dẫn có tốn hạng số tốn hạng có kiểu hợp lệ khơng? o Nếu dẫn có tốn hạng biến số tốn hạng có nằm dải giá trị cho phép không? o Nếu dẫn dẫn rẽ nhánh, nhánh có trỏ tới điểm bắt đầu dẫn khác không? Kiểm tra ngăn xếp mảng biến cục dẫn 3.2.2 Chuẩn bị Sau máyảoJava tải lớp thực xác minh lớp, bước chuẩn bị lớp Trong giai đoạn chuẩn bị, máyảoJava cấp phát nhớ cho biến lớp đặt cho chúng giá trị ban đầu mặc định dựa kiểu biến Các biến lớp không khởi tạo với giá trị ban đầu thích hợp giai đoạn khởi tạo Cũng giai đoạn chuẩn bị, máyảoJava phân bổ nhớ cho cấu trúc liệu nhằm cải thiện hiệu suất chương trình chạy Một ví dụ cấu trúc liệu bảng phương thức, chứa trỏ tới liệu cho phương thức lớp, kể phương thức thừa kế từ lớp cha Một bảng phương thức cho phép phương thức thừa kế gọi đối tượng mà không cần tìm kiếm lớp cha thời điểm gọi 3.2.3 Phân giải Sau lớp thông qua hai giai đoạn liên kết: xác minh chuẩn bị, sẵn sàng cho giai đoạn thứ ba cuối liên kết: phân giải Phân giải q trình xác định vị trí lớp, giao diện, trường, phương pháp tham chiếu cách tượng trưng từ số loại, thay tham chiếu tượng trưng tham khảo trực tiếp Giai đoạn liên kết tùy chọn (và trừ khi) tham chiếu tượng trưng lần chương trình sử dụng 3.3 Khởi tạo Bước cuối cần thiết để sẵn sàng sử dụng lớp giao diện khởi tạo; trình thiết lập biến lớp thành giá trị ban đầu thích hợp, giá trị bắt đầu mong muốn lập trình viên cho biến lớp Trong mã Java, giá trị ban đầu thích hợp xác định thơng qua trình khởi tạo lớp khởi tạo tĩnh Một biến khởi tạo lớp có dạng dấu biểu thức tương đương với khai báo biến lớp, ví dụ: class Example1a { // "= * (int) (Math.random() * 5.0)" // initializer static int size = * (int) (Math.random() * 5.0); } Một khởi tạo tĩnh khối mã bắt đầu từ khóa static, ví dụ: class Example1b { static int size; // This is the static initializer static { size = * (int) (Math.random() * 5.0); } } Tất biến khởi tạo lớp khởi tạo tĩnh kiểu loại thu thập trình biên dịch Java đặt vào phương thức đặc biệt Đối với lớp, phương thức gọi phương thức khởi tạo lớp; interface, phương thức khởi tạo giao diện Phương thức gọi máyảoJava để thiết lập biến tĩnh kiểu với giá trị ban đầu thích hợp chúng Khởi tạo lớp bao gồm hai bước: Khởi tạo lớp cha trực tiếp lớp (nếu có) Thực phương thức khởi tạo lớp lớp (nếu có) Khi khởi tạo lớp cha trực tiếp lớp, hai bước lại lặp lại Kết là, lớp khởi tạo lớp Object, sau tất lớp từ xuống theo phân cấp thừa kế cho lớp khởi tạo MáyảoJava phải đảm bảo trình khởi tạo đồng hóa xác Nếu nhiều luồng cần phải khởi tạo lớp, luồng phép thực khởi tạo luồng khác đợi Sau luồng hồn thành q trình khởi tạo, phải có thông báo cho luồng khác chờ III KHU VỰC DỮ LIỆU THỰC THI Khu vực liệu thực thi MáyảoJava định nghĩa loạt khu vực liệu thời gian chạy (run-time data area) sử dụng trình chạy chương trình Một số khu vực liệu tạo JVM bắt đầu chạy giải phóng JVM Các khu vực liệu khác gắn với luồng: khởi tạo luồng khởi tạo giải phóng luồng kết thúc 1.1 Ngăn xếp JVM Mỗi luồng JVM có ngăn xếp JVM tạo lúc với luồng Ngăn xếp JVM sử dụng để lưu khung ngăn xếp (stack frame) Mỗi khung ngăn xếp dùng để chứa thực thể con: Mảng biến cục Ngăn xếp toán hạng Dữ liệu khung: chứa ký hiệu liên quan tới phương thức 1.2 Khu vực phương thức (Method Area) Khu vực phương thức nơ i lưu trữ liệu mức class - tức toàn liệu có class nằm Mỗi JVM có khu vực phương thức sử dụng nhiều tiến trình 1.3 Khu vực Heap (Heap Area) Khu vực lưu trữ đối tượng thứ liên quan biến, mảng Giống khu vực phương thức, JVM có khu vực Heap Vì vùng tiến trình chia sẻ với nên liệu lưu không đảm bảo thread-safe 1.4 Thanh ghi PC (PC Register) PC viết tắt Program Counter - ghi lưu địa lệnh thực thi Mỗi luồng sở hữu riêng PC 1.5 Ngăn xếp phương thức native Ngăn xếp giữ thông tin native phương thức Mỗi luồng sở hữu ngăn xếp phương thức native riêng Khung ngăn xếp Khung sử dụng để lưu trữ phần liệu kết quả, để thực kết nối động, trả lại giá trị cho phương thức gửi ngoại lệ Một khung tạo phương thức gọi Khung bị phá hủy gọi phương thức hoàn thành, cho dù hoàn thành bình thường hay đột ngột (nó ném ngoại lệ không khai báo) Khung phân bổ từ khu vực heap máyảoJava luồng tạo khung Mỗi khung có mảng biến cục riêng, ngăn xếp tốn hạng riêng nó, tham chiếu đến số thời gian chạy lớp phương thức Một khung mở rộng với thông tin cụ thể thực bổ sung, gỡ lỗi thơng tin Kích cỡ mảng biến cục ngăn xếp toán hạng xác định thời gian biên dịch cung cấp với mã cho phương pháp liên quan đến khung Do đó, kích thước cấu trúc liệu khung phụ thuộc vào việc thực Bộ nhớ cho cấu trúc phân bổ đồng thời thời điểm gọi phương thức Chỉ có khung cho phương thức thực hoạt động điểm chuỗi xử lý định Khung gọi khung tại, phương thức gọi phương thức Lớp phương thức định nghĩa lớp Các thao tác biến cục ngăn xếp toán hạng thường có tham chiếu đến khung Một khung kết thúc phương thức gọi phương thức khác phương thức hoàn thành Khi phương thức gọi, khung tạo trở thành điều khiển chuyển sang phương thức Khi phương thức trả về, khung truyền lại kết việc gọi phương thức, có, đến khung trước Khung sau bị loại bỏ khung trước trở thành khung Lưu ý khung tạo luồng cục cho luồng khơng thể tham chiếu luồng khác 2.1 Các biến địa phương Mỗi khung chứa mảng biến biết đến dạng biến cục Chiều dài mảng biến cục khung xác định thời gian biên dịch cung cấp biểu diễn nhị phân lớp giao diện với mã cho phương thức liên kết với khung Một biến địa phương giữ giá trị kiểu boolean, byte, char, short, int, float, reference, returnAddress Các biến địa phương tham chiếu cách lập mục Chỉ số biến địa phương thứ số không Số nguyên mục hợp lệ biến cục số ngun nằm số khơng kích thước mảng biến cục Giá trị kiểu long kiểu double chiếm hai biến địa phương liên tiếp Giá trị giải sử dụng mục nhỏ Ví dụ, giá trị kiểu double lưu trữ mảng biến cục mục n chiếm biến cục với số n n + MáyảoJava sử dụng biến địa phương để truyền tham số cho việc gọi phương thức Về phương thức gọi lớp, tham số truyền biến cục liên tiếp biến cục (sử dụng để tham chiếu đến đối tượng mà phương thức gọi) Bất kỳ tham số sau truyền biến địa phương liên tiếp biến cục 2.2 Ngăn xếp toán hạng Mỗi khung có ngăn xếp vào cuối đầu (last in first out - LIFO) gọi ngăn xếp tốn hạng Độ sâu tối đa ngăn xếp toán hạng khung xác định thời gian biên dịch cung cấp với mã cho phương thức liên quan đến khung Ngăn xếp tốn hạng rỗng khung chứa tạo MáyảoJava cung cấp lệnh để tải số giá trị từ biến cục trường vào ngăn xếp toán hạng Các lệnh khác máyảoJava đưa toán hạng từ ngăn xếp toán hạng, thực xử lý đẩy kết trở lại vào ngăn xếp toán hạng Ngăn xếp toán hạng sử dụng để chuẩn bị tham số truyền cho phương thức để nhận kết trả phương thức IV MÁY THỰC THI Như trình bày trên, máy thực thi JVM bao gồm thành phần chính: Bộ thơng dịch bytecode (Interpreter) Bộ biên dịch JIT (Just-in-time Compiler) Bộ dọn rác (Garbage Collector) Mỗi thành phần có chiến lược thực thi mã bytecode riêng Không phải máyảoJava có thơng dịch bytecode biên dịch JIT Bộ thông dịch bytecode thiết kế đặc trưng cho thông dịch: Bộ thông dịch bytecode dựa ngăn xếp (Stack-based Bytecode Interpreter): thông dịch mô máy ngăn xếp (stack machine) tất giá trị tạm kết thực thi lưu ngăn xếp tốn hạng Bộ thơng dịch bytecode dựa đăng ký (Register-based Bytecode Interpreter): mô máy đăng ký (register machine), thay đẩy vào/lấy tốn hạng từ ngăn xếp, thơng dịch sử dụng register mơ đa mục đích Kiến trúc thông dịch bytecode bao gồm thành phần sau: Bộ nhớ mã (Code memory): mảng byte lưu dẫn bytecode chương trình (bytecode toán hạng) Địa kiểu số nguyên IP register: trỏ dẫn đóng vai trò register đặc biệt để trỏ tới nhớ mã dẫn cần thực Bộ nhớ toàn cục (Global memory): giữ số lượng định ô nhớ cho biến Các ô nhớ trỏ tới kiểu Integer, Float, String thể struct Ta truy nhập biến qua địa số nguyên CPU: để thực thi dẫn, thơng dịch có CPU mơ cách sử dụng vòng lặp với lệnh switch cho giá trị bytecode Constant pool: đối tượng khơng thể lưu trữ tốn hạng byte đưa vào constant pool Ngăn xếp cho phương thức: dùng để lưu trữ thông tin liên quan đến phương thức gọi bao gồm địa trả về, tham số biến cục FP register: Register chuyên biệt để lưu trỏ trỏ tới đỉnh ngăn xếp cho phương thức Ngoài ra, thơng dịch bytecode dựa ngăn xếp có thêm thành phần sau: Ngăn xếp toán hạng (Operand stack): thay lưu trữ liệu vào register, thông dịch đẩy giá trị tạm lên ngăn xếp toán hạng Tất toán hạng dẫn nhớ mã ngăn xếp toán hạng Sp register: Register chuyên biệt lưu trỏ trỏ tới đỉnh ngăn xếp toán hạng Thay sử dụng ngăn xếp tốn hạng, thông dịch bytecode dựa Register sử dụng tập vô hạn register cho lời gọi phương thức Phương thức truy nhập phần tử mảng register Bộ biên dịch JIT 2.1 Các chế biên dịch JVM 2.1.1 Biên dịch tĩnh (Static compilation) Một phương pháp để giải nhược điểm tốc độ thực thi chậm thông dịch bytecode sử dụng biên dịch tĩnh: biên dịch tồn chương trình Java sang mã native trước thực thi Ưu điểm phương pháp cho tốc độ thực thi nhanh nhiều lần việc thông dịch bytecode Tuy nhiên phương pháp có số nhược điểm: Làm tính khơng phụ thuộc vào tảng (platform independent) JavaMáyảo JVM bị loại bỏ khỏi trình thực thi chương trình Khả tự động quản lý nhớ Java bị hạn chế cài đặt, dẫn tới vấn đề mở rộng hệ thống Với xu hướng dịch chuyển Java phía lập trình cho server, giải pháp biên dịch tĩnh trở nên không khả thi thay động mã nguồn chương trình trình chạy server 2.1.2 Biên dịch JIT hoàn toàn (Total JIT compilation) Một phương pháp khác tiếp cận để tăng tốc thực thi mã bytecode hồn tồn khơng sử dụng thông dịch, biên dịch JIT biên dịch tất phương thức Java sang mã native lần gặp phương thức Việc biên dịch thực thời gian chạy, máyảoJava trước chạy Điều đảm bảo giữ nguyên chất tương thích động Java Ưu điểm phương pháp hoàn toàn loại bỏ thông dịch, nhiên nhược điểm thời gian biên dịch trở thành yếu tố toàn thời gian chạy Việc biên dịch phương thức “nóng” (hot method – phương thức thường xuyên gọi nhiều lần) đem lại lợi ích tương đối lớn, nhiên ta tốn thời gian vào việc biên dịch phương thức “lạnh” (cold method – phương thức không thường xuyên gọi) hay phương thức thực thi lần Một vấn đề có số lượng lớn mã nguồn sau sinh bị loại bỏ, ví dụ trường hợp giả thiết đưa biên dịch khơng đúng, mã nguồn cũ chiếm phần nhớ Vì JVM cần “bộ dọn rác” cho mã nguồn sinh 2.1.3 Bộ thông dịch hỗn hợp (Mixed mode interpretation) Một giải pháp đưa vừa đảm bảo tăng tốc thực thi, vừa khơng làm tính chất “động” Java thông dịch hỗn hợp Trong JVM sử dụng thông dịch hỗn hợp, tất phương thức thông dịch lần gọi Tuy nhiên, phương thức xác định “nóng”, đưa vào biên dịch JIT chuyển thành phương thức native để hoạt động hiệu 2.2 Cơ chế hoạt động biên dịch JIT Sơ đồ luồng thực biên dịch JIT: 2.2.1 Xác định phương thức “nóng” Để xác định phương thức “nóng”, JVM áp dụng số chiến thuật sau: Bộ đếm lần gọi (Invocation counter): đếm gắn với phương thức tăng dần lần phương thức gọi Lấy mẫu luồng phần mềm (Software-based thread sampling): định kỳ kiểm tra luồng chương trình Java lưu lại trỏ dẫn luồng Lấy mẫu phần cứng (Hardware-based sampling): số tảng phần cứng, ví dụ Intel IA-64 cung cấp chế cho phép ứng dụng truy nhập thông tin hoạt động phần cứng 2.2.2 Tối ưu mã nguồn: Như biên dịch khác, biên dịch JIT thực tối ưu mã nguồn chương trình trước chuyển mã nguồn sang mã native Các bước thực tối ưu bao gồm: 2.2.2.1 Inline mã nguồn: Đối với phương thức “nhỏ”, biên dịch JIT thay lời gọi hàm mã nguồn hàm (inline) để loại bỏ bước nhảy gọi hàm việc truyền đối số hay việc trả giá trị hàm Inline mã nguồn tăng tốc độ đáng kể, đặc biệt với hàm thường xuyên gọi loại bỏ bước nhảy tới hàm tương đối tốn chi phí 2.2.2.2 Tối ưu cục mã nguồn (Local optimization): Thực tối ưu cho khối mã nguồn (basic block) Một khối mã nguồn đoạn mã thực từ đầu đến cuối (khơng có bước nhảy giữa) Một số chiến lược tối ưu cục bộ: Đơn giản phép tính tốn: Ví dụ: Tính biên dịch: Ví dụ: Loại bỏ mã nguồn chết (dead code): loại bỏ đoạn mã khơng có ý nghĩa khơng ảnh hưởng tới chương trình khơng gọi tới Loại bỏ dư thừa: loại bỏ đoạn mã bị gọi hay nhiều lần với nội dung không đổi 2.2.2.3 Tối ưu luồng điều khiển (Control flow optimization): Việc thực khối mã nguồn chương trình biểu diễn qua đồ thị luồng điều khiển Ví dụ đồ thị luồng điều khiển: Các tối ưu áp dụng: Sắp xếp lại thứ tự mã nguồn Giảm thiểu vòng lặp Khai mở vòng lặp (loop unrolling) … 2.2.2.4 Tối ưu toàn cục Sau tối ưu cục tối ưu luồng khối mã, biên dịch JIT thực tối ưu toàn cục bao gồm: Loại bỏ đoạn mã không gọi tới Tối ưu phân bổ nhớ (memory allocation optimization) Tối ưu đồng … Bộ dọn rác Bộ dọn rác JVM làm nhiệm vụ 3.1 Khái niệm tự động quản lý vùng nhớ (Automatic memory management) Tự động quản lý vùng nhớ định nghĩa kỹ thuật thu gom rác tự động thực loại bỏ tham chiếu khơng hiệu lực Ưu điểm tự động quản lý vùng nhớ: giải lỗi lập trình liên quan tới nhớ bao gồm lỗi cấp phát nhớ (memory allocation), lỗi tràn đệm (buffer overrun) lỗi rò rỉ nhớ (memory leak) Đây lỗi nghiêm trọng lại khó để phát hay sửa lỗi, chương trình đa luồng Nhược điểm tự động quản lý vùng nhớ kỹ thuật làm chậm lại tốc độ thực thi chương trình 3.2 Các kỹ thuật thu gom rác 3.2.1 Kỹ thuật đếm tham chiếu (Reference counting) Đếm tham chiếu kỹ thuật quản lý nhớ thời gian chạy, chương trình theo dõi số lượng đối tượng “còn sống” (live object) có liên kết tới đối tượng cụ thể Khi số đếm tham chiếu tới đối tượng giảm 0, đối tượng khơng tham chiếu nữa, đối tượng sẵn sàng để giải phóng Tuy nhiên xảy tượng tham chiếu vòng (cycle reference), ví dụ đối tượng tham chiếu tới khơng có đối tượng khác bên ngồi tham chiếu tới, đối tượng không giải phóng dẫn tới lỗi rò rỉ nhớ Ưu điểm phương pháp cài đặt tương đối đơn giản đối tượng khơng tham chiếu giải phóng ngay số đếm tham chiếu đối tượng giảm Nhược điểm phương pháp việc cập nhật số đếm tham chiếu thao tác tốn kém, đặc biệt môi trường song song với yêu cầu đồng 3.2.2 Kỹ thuật theo vết (Tracing) Tư tưởng kỹ thuật theo vết đơn giản: đánh dấu tất đối tượng chương trình nhìn thấy đối tượng “sống” Tiếp đệ quy vòng lặp đánh dấu tất đối tượng tham chiếu tới từ đối tượng “sống” Kỹ thuật thường áp dụng kỹ thuật theo vết kỹ thuật đánh dấu quét (Mark and sweep) Mã giả kỹ thuật này: Mark: Add each object in the root set to a queue For each object X in the queue Mark X reachable Add all objects referenced from X to the queue Sweep: For each object X on the heap If the X not marked, garbage collect it “Root set” tập đối tượng “sống” đầu vào thuật tốn theo vết Thơng thường tập gồm tất đối tượng khung phương thức thực thi chương trình dừng lại để “dọn rác” hình mơ tả đầu vào (before mark) kết (after mark) thực thuật tốn đánh dấu qt: Sau q trình theo vết, đối tượng E không đối tượng khác tham chiếu tới đưa vào “dọn rác” TÀI LIỆU THAM KHẢO T Lindholm, F Yellin, G Bracha, A Buckley, The JavaVirtualMachine Specification, 2013 M Hirt, M Lagergen, Oracle JRockit The Definitive Guide, Packt Publishing, 2010 Terence Parr, Language Implementation Patterns, The Pragmatic Bookshelf, 2010 An Overview of JavaVirtual Machines, https://www.developer.com/java/other/an-overview-of-java-virtual-machinesjvms.html, 2017 Jackson Joseraj, The JVM Architecture https://dzone.com/articles/jvm-architecture-explained, 2016 Explained, Compiler Design – Code Optimization, https://www.tutorialspoint.com/compiler_design/compiler_design_code_optimi zation.htm 0xCAFEBABE – Java class file format, an overview, https://blog.lse.epita.fr/articles/69-0xcafebabe-java-class-file-format-anoverview.html, 2014 Anton Arhipov, Java Bytecode Fundamentals: Using Objects and Calling Methos, https://zeroturnaround.com/rebellabs/java-bytecode-fundamentalsusing-objects-and-calling-methods/, 2011