Máy ảo Java - Vùng dữ liệu thời gian chạy
Đặc tả JVM xác định các vùng dữ liệu thời gian chạy nhất định cần thiết trong quá trình thực thi chương trình. Một số trong số chúng được tạo trong khi JVM khởi động. Những người khác là cục bộ của các luồng và chỉ được tạo khi một luồng được tạo (và bị hủy khi luồng bị hủy). Chúng được liệt kê dưới đây -
Đăng ký PC (Bộ đếm chương trình)
Nó là cục bộ cho mỗi luồng và chứa địa chỉ của lệnh JVM mà luồng hiện đang thực thi.
Cây rơm
Nó là cục bộ cho mỗi luồng và lưu trữ các tham số, biến cục bộ và địa chỉ trả về trong khi gọi phương thức. Lỗi StackOverflow có thể xảy ra nếu một luồng yêu cầu nhiều không gian ngăn xếp hơn mức cho phép. Nếu ngăn xếp có thể mở rộng động, nó vẫn có thể ném OutOfMemoryError.
Đống
Nó được chia sẻ giữa tất cả các luồng và chứa các đối tượng, siêu dữ liệu của lớp, mảng, v.v., được tạo trong thời gian chạy. Nó được tạo ra khi JVM khởi động và bị hủy khi JVM tắt. Bạn có thể kiểm soát số lượng yêu cầu JVM của bạn từ Hệ điều hành bằng cách sử dụng một số cờ nhất định (thêm về điều này sau). Cần cẩn thận để không yêu cầu quá ít hoặc quá nhiều bộ nhớ, vì nó có ý nghĩa quan trọng về hiệu suất. Hơn nữa, GC quản lý không gian này và liên tục loại bỏ các đối tượng đã chết để giải phóng không gian.
Khu vực phương pháp
Vùng thời gian chạy này là chung cho tất cả các luồng và được tạo khi JVM khởi động. Nó lưu trữ các cấu trúc cho mỗi lớp như nhóm hằng số (sẽ nói thêm về điều này sau), mã cho các hàm tạo và phương thức, dữ liệu phương thức, v.v. JLS không chỉ định liệu khu vực này có cần được thu thập rác hay không, và do đó, các triển khai của JVM có thể chọn bỏ qua GC. Hơn nữa, điều này có thể mở rộng hoặc không thể tùy theo nhu cầu của ứng dụng. JLS không bắt buộc bất cứ điều gì liên quan đến điều này.
Nhóm cố định thời gian chạy
JVM duy trì cấu trúc dữ liệu mỗi lớp / mỗi loại hoạt động như bảng biểu tượng (một trong nhiều vai trò của nó) trong khi liên kết các lớp được tải.
Ngăn xếp phương pháp gốc
Khi một luồng gọi ra một phương thức gốc, nó sẽ bước vào một thế giới mới, trong đó các cấu trúc và hạn chế bảo mật của máy ảo Java không còn cản trở sự tự do của nó nữa. Một phương thức gốc có thể có thể truy cập các vùng dữ liệu thời gian chạy của máy ảo (nó phụ thuộc vào giao diện phương thức gốc), nhưng cũng có thể làm bất cứ điều gì khác mà nó muốn.
Thu gom rác thải
JVM quản lý toàn bộ vòng đời của các đối tượng trong Java. Khi một đối tượng được tạo, nhà phát triển không cần phải lo lắng về nó nữa. Trong trường hợp đối tượng trở nên chết (nghĩa là không còn tham chiếu đến nó nữa), nó sẽ bị GC đẩy ra khỏi đống bằng cách sử dụng một trong nhiều thuật toán - GC nối tiếp, CMS, G1, v.v.
Trong quá trình GC, các đối tượng được di chuyển trong bộ nhớ. Do đó, những đối tượng đó không thể sử dụng được trong khi quá trình đang diễn ra. Toàn bộ ứng dụng phải được dừng lại trong thời gian của quá trình. Những lần tạm dừng như vậy được gọi là tạm dừng 'dừng lại trên thế giới' và là một khoản chi phí rất lớn. Các thuật toán GC chủ yếu nhằm mục đích giảm thời gian này. Chúng ta sẽ thảo luận rất chi tiết về vấn đề này trong các chương sau.
Nhờ có GC, việc rò rỉ bộ nhớ rất hiếm trong Java, nhưng chúng có thể xảy ra. Chúng ta sẽ xem trong các chương sau cách tạo rò rỉ bộ nhớ trong Java.