2011-01-31 25 views
73

Đầu tiên, sự khác nhau giữa khoảng trống và vùng nhớ Heap là gì (JVM chọn cách nào để sử dụng từng không gian bộ nhớ)?Không gian cho phép so với không gian Heap

Thứ hai, nhưng quan trọng nhất, loại tỷ lệ nào sẽ được đề xuất cho ứng dụng java loại MVC chuẩn?

Trả lời

75

đống lưu tất cả các đối tượng được tạo bởi chương trình Java của bạn. nội dung của heap được giám sát bởi nhà sưu tập rác, mà giải phóng bộ nhớ từ đống khi bạn ngừng sử dụng một đối tượng (ví dụ: khi không có nhiều tài liệu tham khảo cho các đối tượng.

Điều này trái ngược với chồng, mà các cửa hàng loại nguyên thủy như ints và ký tự, và là các biến thường địa phương và giá trị trả lại chức năng đây không phải là thu gom rác thải

không gian perm đề cập đến một phần đặc biệt của đống Xem này SO câu trả lời cho một lời giải thích:... What is perm space?

+1

Liên kết bạn đã cho biết "phân đoạn của đống" - vì vậy nó thực sự là "một phần đặc biệt của ngăn xếp"? Nó sẽ làm cho ý nghĩa hơn nhiều cho nó là một phần của đống (hoặc thậm chí một số loại phân đoạn dữ liệu tĩnh) chứ không phải là ngăn xếp mà chỉ là không phù hợp cho loại điều đó. –

+1

Nó là một phần đặc biệt của heap. Tôi đã chỉnh sửa câu trả lời của tôi trước khi bạn nhận xét, nhưng tôi đánh giá cao sự điều chỉnh anyway :) – Olhovsky

+1

bất kỳ đề xuất về câu hỏi thứ hai? – Gareth

33

Per Tôi sẽ không coi PermGen là một phần đặc biệt của heap.

Tôi muốn nghĩ nhiều về vùng heap như một vùng bộ nhớ dành riêng để lưu trữ các cá thể đối tượng trong khi PermGen là khu vực dành riêng để lưu trữ các định nghĩa lớp. Kết quả là vòng đời của một heap được gắn với một ứng dụng trong khi vòng đời của PermGen được gắn với một JVM.

Một trong những ví dụ tốt nhất tại sao một ứng dụng và JVM của nó có thể có vòng đời khác nhau trong một thùng chứa Java EE. Trong một máy chủ ứng dụng, các ứng dụng có thể được triển khai và không được triển khai mà không cần khởi động lại máy chủ. Trong quá trình không triển khai (hoặc redeployment), thật dễ dàng để giải phóng tất cả các cá thể đối tượng tức là không gian heap, nhưng khá khó để xóa tất cả các lớp được nạp bởi ứng dụng này từ PermGen vì một số lớp vẫn có thể được JVM tham chiếu.

Một trong các trường hợp như vậy là Leaking Drivers. Khi một ứng dụng được triển khai, một trình điều khiển JDBC được nạp và đăng ký với DriverManager. Khi ứng dụng này không được triển khai, DriverManager tồn tại và giữ một tham chiếu đến trình điều khiển, trình nạp lớp gốc của nó và mọi thứ mà trình nạp lớp này đã nạp. Kết quả là, rò rỉ bộ nhớ trong PermGen được tạo ra, nhưng nó không có lỗi trong quản lý bộ nhớ của ứng dụng.

Đúng là các JVM như JRocket không có PermGen, mọi thứ đều được lưu trữ trong heap. Chỉ trong ngữ cảnh như vậy bạn mới có thể gọi PermGen là "phần đặc biệt" của đống. Thậm chí sau đó, chúng ta vẫn nên xem PermGen và đống khác nhau vì chúng có mục đích rất khác nhau và chúng có các loại rò rỉ bộ nhớ rất khác nhau.

Cập nhật: Trong JDK 8 của Oracle, PermGen là replaced by "Metaspace" và giờ đây chính thức là một phần của vùng heap. Chúng tôi sẽ không cần phải điều chỉnh riêng PermGen nữa.

0

Bạn KHÔNG thể đặt tên cho bộ nhớ được cấp phát trong heap.

Điều đó có nghĩa là int x (tên của nó) được cấp phát trong ngăn xếp. Bạn có thể tiếp cận con trỏ bằng tên của nó, vì vậy con trỏ nằm trong ngăn xếp. Bạn không thể tiếp cận đối tượng bằng tên của nó, vì nó không có tên. Accees cho đối tượng (không tên) phải bằng con trỏ của nó.

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