2016-08-26 14 views
8

Tôi biết có một chi phí nội tại của JVM, và tôi muốn nghiên cứu thêm để xem chính xác chi phí đầu vào là gì.Tại sao JVM sử dụng int khổng lồ [] của tất cả 0?

Sử dụng trình thu thập thông tin YourKit Tôi đã có thể thấy rằng có nhiều int [] chứa đầy thông tin dường như ngẫu nhiên. Tôi đoán là các cửa hàng này có một số chỉ số hiệu suất và những thứ khác mà JVM sử dụng để tối ưu hóa các ứng dụng; nhưng trước sự ngạc nhiên của tôi, tất cả các phần tử đều có giá trị 0.

Để nhận được kết quả của mình, tôi đã sử dụng chương trình "không làm gì" sau, để kết quả chỉ bao gồm những điều xảy ra trên JVM.

public final class Main { 

    public static void main(String[] args) throws InterruptedException { 
     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

Đây là ảnh chụp màn hình của kết quả lược tả và tôi có thể tải lên ảnh chụp nhanh nếu cần.

Screenshot from YourKit profiler

+3

Có lẽ đó là lý do tại sao anh ấy đăng câu hỏi này ...? –

+1

@Jire Vui lòng không thực hiện các chỉnh sửa đáng kể để chiếm đoạt bài đăng. Trong trường hợp này OP chấp thuận nó, nhưng nói chung là không thể chấp nhận được. – 4castle

+0

@ 4castle Tiếng Anh không phải là tiếng mẹ đẻ của tôi vì vậy tôi đánh giá cao những chỉnh sửa của anh ấy. Cảm ơn cho FYI. –

Trả lời

0

Tôi đã chơi xung quanh với điều này một số chi tiết và nó chắc chắn đã làm với kích thước heap. Ví dụ: nếu tôi đặt -Xmx5m -Xmx5m, phân bổ mảng int sẽ biến mất. Trong khi nếu tôi đặt -Xmx5g-Xms5g thì nó sẽ tạo ra một mảng lớn hơn rất nhiều.

enter image description here

Tôi tự hỏi những gì họ sử dụng chúng cho.

Nhận trợ giúp từ/r/java.

"Có lẽ, đó là các đối tượng phụ trong Bộ đệm phân bổ cục bộ chủ đề giúp phân tích cú pháp heap: https://shipilev.net/jvm-anatomy-park/5-tlabs-and-heap-parsability/ Chúng được cho là không thể truy cập được và được lọc theo các công cụ phân tích cú pháp vùng heap. Đối tượng (có thể truy cập và không thể truy cập) "."

+0

Điều này có thể sẽ bị gắn cờ và có thể bị xóa sớm, bởi vì nó không phải là câu trả lời cho câu hỏi.Thay vào đó, bạn nên chỉnh sửa câu hỏi của mình và bao gồm thông tin mới mà bạn đã tìm thấy. – Marco13

1

Bạn có thể tìm câu trả lời bằng cách kiểm tra các liên kết đến những mảng. Chỉ cần kích chuột phải vào một mảng có thể truy cập, chọn 'Selected Objects' và sau đó chuyển sang 'Incoming References'.

tôi thấy rằng có những bảng trong sun.util.calendar.ZoneInfo, sun.util.Calendar.BaseCalendar, java.util.Currency, vv

Thật khó để nói chắc chắn, nhưng rất có thể, những người không thể truy cập mảng không-zeroed lớn đã được sử dụng bởi JVM để tải mã byte Java từ .class-files. JVM không cần chúng sau khi biên dịch, vì vậy chúng đã được phát hành nhưng chưa thu thập được.

+2

Cảm ơn bạn đã không biết điều đó. Nhưng mối quan tâm chính của tôi là các mảng với> 600k chỉ số không thể truy cập được. –

+0

Tôi đã thêm suy nghĩ của mình vào câu trả lời đó. –

+1

Chúng không bao giờ được thu thập trong toàn bộ thời gian tồn tại của chương trình, điều này khiến chúng tôi tự hỏi chúng được sử dụng như thế nào. Lý thuyết tốt mặc dù :) –

Các vấn đề liên quan