Câu trả lời:
sử dụng các đối số -Xms<memory>
-Xmx<memory>
. Sử dụng M
hoặc G
sau các số để chỉ Megs và Gigs byte tương ứng. -Xms
chỉ ra mức tối thiểu và -Xmx
tối đa
-Xmx524M
và quá trình này chiếm tới 1,2 GB RAM. (?)
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.
-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;)
MaxDirectMemorySize
Chỉ ả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.
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
ulimit
mộ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 ulimit
và JVM. Y
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.
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.