Câu hỏi của tôi là như sau:Do mảng đã nhập giúp JIT tối ưu hóa tốt hơn?
thông thường của nó đối với mã Java đã sưu tập chung thực hiện như:
public class GenericCollection<T> {
private Object[] data;
public GenericCollection() {
// Backing array is a plain object array.
this.data = new Object[10];
}
@SuppressWarnings("unchecked")
public T get(int index) {
// And we just cast to appropriate type when needed.
return (T) this.data[index];
}
}
Và sử dụng như thế này ví dụ:
for (MyObject obj : genericCollection) {
obj.myObjectMethod();
}
Kể từ khi loại chung của genericCollection bị xóa, JVM dường như không có cách nào để biết rằng thực sự bên trong mảng 'data' của genericCollection chỉ có MyObject, vì kiểu thực tế của mảng là Object, có thể có một String trong đó, và gọi 'myObjectMethod' trên nó sẽ làm tăng một ngoại lệ.
Vì vậy, tôi giả sử JVM phải thực hiện một số kiểm tra thời gian chạy thể dục để biết những gì thực sự là bên trong trường hợp GenericCollection đó.
Bây giờ nhìn vào thực hiện điều này:
public class GenericCollection<T> {
private T[] data;
@SuppressWarnings("unchecked")
public GenericCollection (Class<T> type) {
// Create a type specific array.
this.data = (T[]) Array.newInstance(type, 10);
}
public T get (int index) {
// No unsafe casts needed.
return this.data[index];
}
}
Trong trường hợp này, chúng tôi tạo ra một mảng loại cụ thể thông qua phản ánh, vì vậy JVM có thể suy ra có thể có chỉ là đối tượng T bên trong đó mảng trong một bối cảnh nhất định, làm cho các phôi không an toàn và có thể kiểm tra loại đắt tiền thừa.
Câu hỏi của tôi là, vì những điều HotSpot có thể làm, nó có giúp ích gì, hiệu quả, để triển khai các bộ sưu tập chung với một mảng sao lưu cụ thể kiểu "thích hợp" không?
Ví dụ, nó có giúp HotSpot trong việc loại bỏ kiểm tra loại hoặc phôi không cần thiết? Có lẽ có thể cho phép nó dễ dàng hơn các phương thức nội tuyến vì nó biết mảng sao lưu là của một kiểu cụ thể?
hotspot JIT chủ yếu dựa trên các loại quan sát bởi profiling và không loại thông tin java cấp. Vì vậy, tạo mảng của nhiều loại khác nhau thực sự có thể tạo mã đa hình trong các đường dẫn mã không được mã hóa – the8472