Làm cách nào để thiết lập mức sử dụng bộ nhớ tối đa cho JVM?


132

Tôi muốn giới hạn bộ nhớ tối đa được sử dụng bởi JVM. Lưu ý, đây không chỉ là heap, tôi muốn giới hạn tổng bộ nhớ được sử dụng bởi quá trình này.

Câu trả lời:


94

sử dụng các đối số -Xms<memory> -Xmx<memory>. Sử dụng Mhoặc Gsau các số để chỉ Megs và Gigs byte tương ứng. -Xmschỉ ra mức tối thiểu và -Xmxtối đa


1
bạn cũng có thể muốn xem MaxPermSize.
urmalp

89
anh ta đang hỏi về bộ nhớ JVM. Những gì bạn đã nói là kích thước đống. Cả hai đều khác nhau
vsingh

8
Để lặp lại những gì các bình luận khác đề cập, Xms và Xmx chỉ định cấu hình heap. Mặc dù việc định cấu hình các biến này có ảnh hưởng gián tiếp đến không gian heap, nhưng người đặt câu hỏi đang cố gắng thiết lập nếu có cách nào để định cấu hình tổng mức sử dụng bộ nhớ (heap + non-heap)
murungu

2
ừ Vì vậy, tôi đã thiết lập -Xmx524Mvà quá trình này chiếm tới 1,2 GB RAM. (?)
phil294

7
Đây không phải là câu trả lời chính xác, các tùy chọn -Xms và -Xmx chỉ điều chỉnh kích thước heap jvm, không phải phân bổ tổng bộ nhớ.
Peter De Winter

31

Bạn không cần phải lo lắng về bộ nhớ bị rò rỉ ngăn xếp (nó rất không phổ biến). Lần duy nhất bạn có thể khiến ngăn xếp vượt khỏi tầm kiểm soát là với đệ quy vô hạn (hoặc thực sự sâu).

Đây chỉ là đống. Xin lỗi, lúc đầu không đọc câu hỏi của bạn.

Bạn cần chạy JVM với đối số dòng lệnh sau.

-Xmx<ammount of memory>

Thí dụ:

-Xmx1024m

Điều đó sẽ cho phép tối đa 1GB bộ nhớ cho JVM.


1
Đó là không đúng, theo chủ đề này, có nhiều cách bạn có thể bị rò rỉ bên ngoài đống stackoverflow.com/questions/1475290/...
erotsppa

Bạn đã đúng, có rất nhiều cách để có vấn đề về bộ nhớ không liên quan đến ngăn xếp. Tuy nhiên, chúng không phổ biến lắm.
jjnguy

9
Khá chắc chắn rằng bạn không thể kiểm soát kích thước bộ nhớ không heap, bạn có thể?
matt b

Khá chắc chắn rằng bạn có thể kiểm soát nó thông qua -XX:MaxDirectMemorySize. Không phải là tôi đã định hình rất nhiều để đảm bảo nhưng vẫn còn;)
alexandergunnarson

2
@alexandergunnarson MaxDirectMemorySizeChỉ ảnh hưởng đến bộ đệm NIO. Tất cả các loại bộ nhớ riêng khác được JVM sử dụng.
Christopher Schultz

16

Nếu bạn muốn giới hạn bộ nhớ cho jvm (không phải kích thước heap) ulimit -v

Để có được ý tưởng về sự khác biệt giữa jvm và bộ nhớ heap, hãy xem bài viết tuyệt vời này http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html


8
ulimitmột lệnh Linux? Tôi đã thực hiện một tìm kiếm nhanh trên Google và không thấy bất kỳ mối quan hệ nào giữa ulimitvà JVM. Y
Sam


11

Câu trả lời ở trên là chính xác, bạn không thể kiểm soát một cách duyên dáng bao nhiêu bộ nhớ gốc mà một quá trình java phân bổ. Nó phụ thuộc vào những gì ứng dụng của bạn đang làm.

Điều đó nói rằng, tùy thuộc vào nền tảng, bạn có thể sử dụng một số cơ chế, ví dụ như ulimit, để giới hạn kích thước của java hoặc bất kỳ quy trình nào khác.

Chỉ không hy vọng nó sẽ thất bại một cách duyên dáng nếu nó đạt đến giới hạn đó. Lỗi phân bổ bộ nhớ riêng khó xử lý hơn nhiều so với lỗi phân bổ trên heap java. Có một cơ hội khá tốt, ứng dụng sẽ gặp sự cố nhưng tùy thuộc vào mức độ quan trọng của hệ thống để giảm kích thước quy trình mà vẫn có thể phù hợp với bạn.


1

Có thể tăng thêm NativeHeap bằng -XX: MaxDirectMemorySize = 256M (mặc định là 128)

Tôi chưa bao giờ sử dụng nó. Có lẽ bạn sẽ thấy nó hữu ích.


1
Tôi nghi ngờ rằng op muốn điều này: bộ nhớ riêng được sử dụng khi bạn thực hiện cuộc gọi đến mã C / C ++ từ java.
om-nom-nom

6
bộ nhớ riêng cũng được sử dụng khi thực hiện các cuộc gọi nio nếu bạn phân bổ bộ đệm với bộ nhớ trực tiếp. (... và trình nạp lớp và thông tin chủ đề ....)
stu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.