Vấn đề: Tôi có một phương thức biên dịch đến hơn 8000 byte bytecode Java. HotSpot có giới hạn phép thuật khiến JIT không khởi động các phương thức vượt quá 8000 byte. (Có, nó là hợp lý để có một phương pháp rất lớn. Đây là một vòng lặp tokenizer.) Phương thức này nằm trong thư viện và tôi không muốn yêu cầu người dùng thư viện phải cấu hình HotSpot để hủy kích hoạt giới hạn ma thuật.Có trình tối ưu hóa bytecode Java nào xóa các ảnh không sử dụng được không?
Quan sát: Việc giải mã mã byte cho thấy Trình biên dịch Java của Eclipse tạo ra rất nhiều hình ảnh vô nghĩa. (javac thậm chí còn tồi tệ hơn.) Đó là, có những gotos mà chỉ có thể truy cập từ nhảy. Rõ ràng, nhảy nhảy đến goto thay vào đó nên nhảy trực tiếp nơi nhảy goto và goto nên được loại bỏ.
Câu hỏi: Có trình tối ưu hóa bytecode cho các tệp lớp Java 5 làm phẳng chuỗi nhảy vô nghĩa và sau đó loại bỏ các ảnh không cần thiết?
Edit: Tôi có nghĩa là các mẫu như:
8698: goto 8548
8701: goto 0
Rõ ràng, goto thứ hai chỉ có thể đạt được bởi một bước nhảy đến 8701 mà cũng có thể là một bước nhảy trực tiếp đến 0.
Trên một thứ hai điều tra, mẫu đáng ngờ này là phổ biến hơn:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
đâu rõ ràng, người ta muốn trình biên dịch để đảo ngược "không bình đẳng" so với "bình đẳng" so sánh, nhảy đến 870 4 và loại bỏ các goto.
Một số kiến trúc có giới hạn về mức độ tương đối của nhánh tương đối (vì chúng giữ địa chỉ trong thanh ghi 8 hoặc 16 bit) nên chúng thường đi xung quanh đó với nhánh tương đối đến chi nhánh không liên quan đã sử dụng đầy đủ kích thước bộ đếm chương trình. Là JVM như thế? –
Bạn có nghĩa là * LABELS * chỉ có thể truy cập từ các bước nhảy không? –
Một chú thích thời gian chạy để đưa ra một gợi ý cho JVM chắc chắn sẽ tốt đẹp trong trường hợp này .... nhưng tôi không nghĩ rằng một điều như vậy tồn tại (và một google nhanh chóng không bật lên bất cứ điều gì.) – Jared