2012-08-24 23 views
8

Câu hỏi của tôi là như tiêu đề, và tôi đã nhận một số kiến ​​thức bằng cách tìm kiếm:Tại sao JVM tiêu thụ ít bộ nhớ hơn -Xms được chỉ định?

  1. linux đã chia sẻ bộ nhớ How to measure actual memory usage of an application or process?

  2. JVM sẽ bảo lưu lượng bộ nhớ setted trong XMS What does the -Xms JVM mean in reference to heap memory?

Nhưng vẫn không biết tại sao, một số trên có thể cung cấp một số trợ giúp?

Đây là lần chạy thử nghiệm của tôi trên Ubuntu12.04 (64bit) | JDK 1.7.0_04. và đầu cho thấy dưới đây:

PID USER  PR NI VIRT RES  SHR S %CPU %MEM TIME+ COMMAND 
4067 brian  20 0 5316m **262m** 7496 S 0 3.3 0:00.30 java -**Xms4096m** -Xmx4096m Test 
4066 brian  20 0 3182m **256m** 7496 S 0 3.3 0:00.30 java -**Xms2048m** -Xmx2048m Test 
4065 brian  20 0 2114m **252m** 7492 S 0 3.2 0:00.30 java -**Xms1024m** -Xmx1024m Test 
4064 brian  20 0 1314m **76m** 7584 S 0 1.0 0:00.20 java -**Xms256m** -Xmx256m Test 
4063 brian  20 0 1180m **51m** 7608 S 0 0.7 0:00.21 java -**Xms128m** -Xmx128m Test 

Trả lời

5

Bạn đang tìm kiếm tại cư dân bộ nhớ - đó là, RAM vật lý tiêu thụ. Xem here để biết thêm thông tin.

Bộ nhớ ảo virtual, tuy nhiên, là bộ nhớ được ứng dụng của bạn tiêu thụ, bao gồm cả bộ nhớ được hoán đổi (vào đĩa). Bạn sẽ thấy có sự tương ứng gần hơn với bộ nhớ ảo và cài đặt -Xms của bạn.

Xem this ServerFault answer để biết thêm thông tin.

+0

sắp hỏi "tại sao trao đổi được sử dụng ngay cả khi bộ nhớ của tôi dồi dào". và nhận được câu trả lời từ url bạn đã đính kèm ... cảm ơn bạn! –

+0

Vậy khi nào bộ nhớ RES sẽ tăng xms? Tôi có một tiến bộ mà xms và xmx = 6g, và sau khi nó bootstrap, RES là 4g, sau một ngày, nó là 5,9g, nhưng khi tôi đổ đống, nó chỉ là 3,9g. Vì vậy, sẽ jvm tiếp tục tiêu thụ bộ nhớ cho đến khi xms khi nó cần ngay cả khi các đối tượng được sử dụng trong bộ nhớ không cần nhiều? – Jaskey

3

Khi JVM của bạn bắt đầu, nó sẽ giữ kích thước heap tối đa của bạn là một khối liên tục của bộ nhớ ảo khi khởi động. Tuy nhiên, chỉ những trang thực sự được sử dụng mới trở thành trang thường trú (bộ nhớ chính thực)

Khi bạn đặt kích thước tối thiểu, nó không buộc JVM sử dụng nhiều bộ nhớ đó nếu không cần. Thay vào đó, bạn cần ít nỗ lực để giảm bộ nhớ cho đến thời điểm này (bạn vẫn có thể thấy một số bộ sưu tập nhỏ) Trong hầu hết các ứng dụng, kích thước tối thiểu đạt được gần như ngay lập tức, nhưng chương trình "hello world" sẽ sử dụng cùng một bộ nhớ bất kể bạn đã đặt bao nhiêu kích thước tối thiểu được.

+0

vì vậy bạn có nghĩa là, nếu tôi đặt xms = xmx = 6g, phần lớn thời gian gc không được kích hoạt ngay cả khi tôi chỉ có 4g đối tượng có thể truy cập? – Jaskey

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