Heap và stack đều là hai khu vực bộ nhớ rất quen thuộc nhưng vai trò của chúng thì khác biệt nhau hẳn. Lượt qua cái xem nhé:
Heap: Là khu vực bộ nhớ cấp phát động, có thể được cấp phát thêm khi đạt đến giới hạn
Các thành phần data như object, instance variable, class variable đều nằm trong heap. Khi bạn tạo quá nhiều object sẽ rất dễ tràn bộ nhớ Heap: OutOfMemoryError.
Stack: Là khu vực bộ nhớ có giới hạn được cấp phát để lưu local variable (tham số truyền vào một method hoặc là các biến được khai báo bên trong một method), reference variable và method call. Khi bạn sử dụng giải thuật đệ quy không khéo léo sẽ rất dễ tràn bộ nhớ stack vì số lượng method call không kiểm soát được: StackOverFlowError.
Trong lập trình thread: Stack là phần bộ nhớ private của mỗi thread, thread khác không xâm phạm được còn heap là phần bộ nhớ chia sẻ. Các thread có thể lần lượt truy xuất, thay đổi khu vực dữ liệu này. Để đảm bảo không có xung đột, trong lập trình multithread, lập trình viên chúng ta thường cần phải sử dụng các cơ chế đồng bộ.
GC đối xử với các bộ nhớ này như thế nào ?
GC chuyên dùng để dọn dẹp bộ nhớ heap. Bất cứ khi nào một object không còn được tham chiếu nữa thì nó sẽ bị GC xem xét để xóa bỏ. Riêng với object là thread thì GC chỉ được xem xét xóa bỏ nó khi trạng thái của thread object isAlive() = false.
Ngoài hai bộ nhớ stack và heap, trong Java còn có một loại bộ nhớ nữa gọi là Perm. Đây là khu vực chứa class metadata. Bạn có thể thấy có trường hợp vùng nhớ này bị quá tải khi deploy ứng dụng lên tomcat. Mỗi lần deploy ứng dụng, class metadata của ứng dụng đó lại được sinh thêm ra, trong khi đó các class metadata cũ lại không được dọn dẹp nên dẫn đến tình trạng quá tải. Khi gặp tình huống này thì bạn chỉ còn cách restart tomcat để dọn sạch vùng nhớ perm đang bi Tomcat process chiếm dụng.
Không có nhận xét nào:
Đăng nhận xét