2009-12-22 33 views
6

Trên máy Windows 64 bit có RAM 12GB và Bộ nhớ ảo 33 GB (mỗi Trình quản lý tác vụ), tôi có thể chạy Java (1.6.0_03-b05) với cài đặt không thể Xmx là 3.5TB nhưng không thành công với 35TB. Logic đằng sau khi nó hoạt động là gì và khi nào nó không thành công? Lỗi tại 35TB dường như ngụ ý rằng nó đang cố gắng để dự trữ không gian lúc khởi động. Tại sao nó sẽ làm điều đó cho -Xmx (như trái ngược với-Xms)?Tại sao tôi có thể đặt -Xmx thành một giá trị lớn hơn bộ nhớ vật lý và ảo trên máy trên cả Windows và Solaris?

 
C:\temp>java -Xmx3500g ostest 
os.arch=amd64 
13781729280 Bytes RAM 

C:\temp>java -Xmx35000g ostest 
Error occurred during initialization of VM 
Could not reserve enough space for object heap 
Could not create the Java virtual machine. 

Trên Solaris (RAM 4GB, Java 1.5.0_16), tôi đã bỏ khá nhiều ở mức 1 PB cho mức độ cao mà tôi có thể đặt -Xmx. Tôi không hiểu logic khi nó sẽ lỗi trên thiết lập -Xmx.

 
devsun1.mgo:/export/home/mgo> java -d64 -Xmx1000000g ostest 
os.arch=sparcv9 
4294967296 Bytes RAM 

Trả lời

11

Ít nhất với Sun 64-bit VM 1.6.0_17 cho Windows, ObjectStartArray :: initialize sẽ cấp phát 1 byte cho mỗi 512 byte đống trên máy ảo khởi động. Khởi động máy ảo với heap 35TB sẽ khiến VM phân bổ 70GB ngay lập tức và do đó không thành công trên hệ thống của bạn.

Máy ảo 32 bit (và vì vậy tôi giả sử máy ảo 64 bit) từ Sun không tính đến bộ nhớ vật lý sẵn có khi tính toán số lượng tối đa, nhưng chỉ bị giới hạn bởi bộ nhớ địa chỉ 2GB trên Windows và Linux hoặc 4GB trên Solaris hoặc có thể không phân bổ đủ bộ nhớ khi khởi động cho khu vực quản lý.

Nếu bạn nghĩ về điều đó, kiểm tra tính đúng đắn của giá trị heap tối đa đối với bộ nhớ vật lý có sẵn không có ý nghĩa nhiều. X GB bộ nhớ vật lý không có nghĩa là X GB có sẵn cho máy ảo khi được yêu cầu, nó cũng có thể được sử dụng bởi các quá trình khác, vì vậy VM cần một cách để đối phó với tình huống cần nhiều heap hơn hệ điều hành anyway. Nếu VM không bị hỏng, OutOfMemoryErrors được ném ra nếu bộ nhớ không thể được cấp phát từ hệ điều hành, giống như kích thước heap tối đa đã đạt được.

8

Theo this thread trên các diễn đàn java của Sun (OP có 16GB bộ nhớ vật lý):

Bạn có thể chỉ định -Xmx20g, nhưng nếu tổng số bộ nhớ cần thiết cho tất cả các quá trình trên của bạn máy luôn vượt quá bộ nhớ vật lý trên máy của bạn, bạn có khả năng sẽ kết thúc phân trang. Một số ứng dụng có thể tồn tại chạy trong bộ nhớ phân trang, nhưng JVM không phải là một trong số chúng. Mã của bạn có thể chạy ổn, nhưng, ví dụ, các bộ sưu tập rác sẽ bị chậm.

UPDATE: Tôi googled một chút nữa và, theo Frequently Asked Questions About the Java HotSpot VM và chính xác hơn How large a heap can I create using a 64-bit VM?

Làm thế nào lớn một đống tôi có thể tạo ra bằng cách sử dụng máy ảo 64-bit?

Mở máy ảo 64-bit, bạn có 64 bit của định địa chỉ để làm việc với kết quả trong một kích thước Java heap tối đa hạn chế chỉ bởi số lượng bộ nhớ vật lý và không gian hoán đổi hệ thống của bạn cung cấp.
cũng Why can't I get a larger heap with the 32-bit JVM?

Xem Tôi không biết lý do tại sao bạn có thể bắt đầu một JVM với một đống> 45GB. Điều này hơi khó hiểu ...

1

Chỉ cần thực thi lại câu trả lời của Pascal - Hãy rất cẩn thận trong các cửa sổ khi chỉ định kích thước bộ nhớ tối đa cao. Tôi đã làm việc trên một dự án máy chủ đòi hỏi nhiều bộ nhớ vật lý nhất có thể, nhưng một khi bạn đang ở trên ram vật lý, hiệu suất không phải là một mô tả tốt về những gì xảy ra - Máy Hưng có thể tốt hơn.

Điều gì xảy ra (ít nhất đây là đánh giá của tôi về nó sau ngày kiểm tra nhật ký và kiểm tra lại), Windows hết RAM và yêu cầu tất cả ứng dụng giải phóng những gì họ có thể. Khi nó hỏi Java, Java khởi động một GC. GC chạm vào tất cả bộ nhớ (gây ra bất kỳ thứ gì đã được hoán đổi để đổi chỗ). Điều này sẽ làm cho các cửa sổ hết bộ nhớ. Windows sau đó gửi tin nhắn đến tất cả các ứng dụng yêu cầu họ giải phóng những gì họ có thể .... (recurse vô thời hạn)

Điều này có thể không thực sự là những gì đang diễn ra, nhưng thực tế là Java GC chạm vào bộ nhớ rất cũ làm cho nó không tương thích với phân trang.

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