Không hiểu ý nghĩa chính xác của bộ nhớ "cam kết" là khi giá trị được truy vấn từ lớp MemoryUsage. Lớp đó giải thích nó là "cam kết đại diện cho số lượng bộ nhớ (tính theo byte) được đảm bảo có sẵn để sử dụng bởi máy ảo Java." Điều này có nghĩa là bộ nhớ đang được sử dụng bởi quá trình jvm và KHÔNG có sẵn cho các quá trình khác cho đến khi nó được phát hành bởi quá trình java, hoặc có nghĩa là quá trình java sẽ thành công nếu nó cố gắng cấp phát cho số lượng bộ nhớ đó ? Tôi nhận ra điều này có thể được thực hiện cụ thể nhưng tôi chỉ quan tâm đến điểm nóng.Trạng thái chính xác của bộ nhớ đã cam kết trong java
Trả lời
Kích thước cam kết là bộ nhớ được cấp phát thực sự, kích thước được sử dụng là kích thước được sử dụng để lưu trữ dữ liệu thực tế (khi được sử dụng ~ = cam kết là thời gian cho GC chính và có thể phát triển vùng heap). Kích thước tối đa là giới hạn cứng mà heap có thể phát triển - nếu không đủ JVM sẽ ném OutOfMemoryError.
Nếu bộ nhớ được cam kết thì chắc chắn nó có thể được sử dụng. Ngoài ra, dịp duy nhất khi JVM không thể thực hiện thêm bộ nhớ (trên một hệ điều hành hiện đại) là nếu phần cứng hết bộ nhớ ảo.
Tất cả các kích thước này chỉ cho bạn biết kích thước của vùng heap. JVM cũng có các vùng bộ nhớ khác (các ngăn xếp luồng, bộ đệm JIT, vv) Vùng heap thường lớn nhất, khoảng này tương ứng với dấu chân tiến trình.
Hai lưu ý:
- nếu kích thước cam kết không phù hợp trong bộ nhớ vật lý, các bộ phận của nó sẽ được hoán đổi với các tập tin trang. Điều này dẫn đến sự chậm lại lớn trong GC và trong những trường hợp như vậy, bạn sẽ cải thiện hiệu suất ứng dụng bằng cách giảm kích thước heap.
- một số hệ điều hành cho phép đặt phòng đôi bộ nhớ - bạn có thể phân bổ nhiều như bạn muốn miễn là bạn không nên cố gắng sử dụng nó (quên mà hệ điều hành đó là - ai đó lấp đầy tôi trong)
"Điều này có nghĩa là bộ nhớ đang được sử dụng bởi quy trình jvm và KHÔNG có sẵn cho các quy trình khác" sẽ là đúng. Vì vậy, nó ít hơn (hoặc bằng) số lượng bộ nhớ hệ điều hành nhìn thấy như được thực hiện bởi quá trình JVM.
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html (xin lỗi không có liên kết để neo).
Ít nhất Linux có thể thực hiện việc đặt phòng đôi này; nó được gọi là "overcommit". http://opsmonkey.blogspot.com/2007/01/linux-memory-overcommit.html – sleske
"Kích thước cam kết là bộ nhớ được cấp phát thực sự, kích thước được sử dụng là kích thước được sử dụng để lưu trữ dữ liệu thực tế (khi được sử dụng ~ = cam kết là thời gian cho GC chính và có thể tăng trưởng vùng heap). Kích thước tối đa là giới hạn cứng mà heap có thể phát triển - nếu không đủ JVM sẽ ném OutOfMemoryError. " đối với tôi điều này có nghĩa là đôi khi (nó phụ thuộc vào giá trị tối đa của đống, -Xmx), bạn sẽ nhận được OutOfMemoryError? –