Máy ảo Java - Tối ưu hóa JIT
Trong chương này, chúng ta sẽ tìm hiểu về Tối ưu hóa JIT.
Nội tuyến phương pháp
Trong kỹ thuật tối ưu hóa này, trình biên dịch quyết định thay thế các lệnh gọi hàm của bạn bằng thân hàm. Dưới đây là một ví dụ cho tương tự -
int sum3;
static int add(int a, int b) {
return a + b;
}
public static void main(String…args) {
sum3 = add(5,7) + add(4,2);
}
//after method inlining
public static void main(String…args) {
sum3 = 5+ 7 + 4 + 2;
}
Sử dụng kỹ thuật này, trình biên dịch giúp máy tiết kiệm chi phí thực hiện bất kỳ lệnh gọi hàm nào (nó yêu cầu đẩy và đưa các tham số vào ngăn xếp). Do đó, mã được tạo chạy nhanh hơn.
Nội tuyến phương thức chỉ có thể được thực hiện cho các hàm không ảo (các hàm không bị ghi đè). Hãy xem xét điều gì sẽ xảy ra nếu phương thức 'add' bị đè lên trong một lớp con và loại đối tượng chứa phương thức không được biết cho đến thời gian chạy. Trong trường hợp này, trình biên dịch sẽ không biết phương pháp nào để nội tuyến. Nhưng nếu phương thức được đánh dấu là 'cuối cùng', thì trình biên dịch sẽ dễ dàng biết rằng nó có thể nằm trong dòng bởi vì nó không thể bị đè nén bởi bất kỳ lớp con nào. Lưu ý rằng hoàn toàn không đảm bảo rằng một phương pháp cuối cùng sẽ luôn nằm trong hàng.
Không thể truy cập và loại bỏ mã chết
Mã không thể truy cập là mã không thể truy cập được bằng bất kỳ luồng thực thi nào. Chúng ta sẽ xem xét ví dụ sau:
void foo() {
if (a) return;
else return;
foobar(a,b); //unreachable code, compile time error
}
Mã chết cũng là mã không thể truy cập được, nhưng trình biên dịch không tạo ra lỗi trong trường hợp này. Thay vào đó, chúng tôi chỉ nhận được một cảnh báo. Mỗi khối mã như hàm tạo, hàm, try, catch, if, while, v.v., có các quy tắc riêng cho mã không thể truy cập được xác định trong JLS (Java Language Specification).
Gấp liên tục
Để hiểu khái niệm gấp không đổi, hãy xem ví dụ dưới đây.
final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.