Tăng kích thước heap trong Java


276

Tôi đang làm việc trên máy chủ Windows 2003 (64-bit) với RAM 8 GB. Làm thế nào tôi có thể tăng tối đa bộ nhớ heap? Tôi đang sử dụng -Xmx1500mcờ để tăng kích thước heap lên 1500 Mb. Tôi có thể tăng bộ nhớ heap lên 75% bộ nhớ vật lý (6 GB Heap) không?


2
Bạn đã thử -Xmx6gchưa Điều này không làm việc? Bạn đã quan sát cái gì?
oxbow_lakes

2
Tôi đoán bạn đã cố gắng tăng heap nhưng thất bại? Bạn có đang sử dụng JVM 64 bit không?
Bart Kiers

Cảm ơn đã bình luận nhưng điều này không hiệu quả
Sunil

Chà - làm sao bạn biết nó không hoạt động? JVM không bắt đầu?
oxbow_lakes

Câu trả lời:


327

Bạn có thể tăng lên 4GB trên hệ thống 32 bit. Nếu bạn đang sử dụng hệ thống 64 bit, bạn có thể tăng cao hơn. Không cần phải lo lắng nếu bạn chọn sai, nếu bạn yêu cầu 5g trên hệ thống 32 bit, java sẽ phàn nàn về một giá trị không hợp lệ và thoát.

Như những người khác đã đăng, sử dụng cờ dòng cmd - vd

java -Xmx6g myprogram

Dù sao, bạn cũng có thể nhận được một danh sách đầy đủ (hoặc một danh sách gần như đầy đủ) bằng cách nhập java -X.


16
Theo kinh nghiệm của tôi, Java kích thước heap thực tế sẽ chấp nhận sử dụng máy ảo 32b (trên hệ thống 32b hoặc 64b - VM là phần quan trọng ở đây), khoảng 2G. Ngoài ra, người hỏi ngạc nhiên trước tiên không tìm kiếm và tìm kiếm: stackoverflow.com/questions/1596009/
triệt

2
dĩ nhiên, bạn đúng - trên hệ thống 32 bit, bạn chỉ có thể giải quyết 2 Gb bộ nhớ.
Steve B.

Có cần thiết cho heap tối đa và kích thước heap tối thiểu là như nhau không?
dùng1747935

1
Không. Nhưng mọi người thường làm điều đó vì JVM không bao giờ có thể lãng phí thời gian thay đổi kích thước. Nghi ngờ rằng nó quan trọng nhiều, TBH.
Steve B.

1
@PhilipRego bạn đặt nó thành bất cứ điều gì bạn muốn, đến giới hạn mà JVM có thể giải quyết. -Xmx2G đặt bộ nhớ của bạn thành 2G (cũng nhìn vào -Xms). Điều này không nói lên bất cứ điều gì về việc bạn sẽ cần bao nhiêu bộ nhớ.
Steve B.

155

Có thể tăng kích thước heap được phân bổ bởi JVM bằng cách sử dụng các tùy chọn dòng lệnh Ở đây chúng tôi có 3 tùy chọn

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

java -Xms16m -Xmx64m ClassName

Trong dòng trên, chúng ta có thể đặt heap tối thiểu thành 16mb và heap tối đa 64mb


28

Trên JVM 32 bit, kích thước heap lớn nhất mà bạn có thể đặt theo lý thuyết là 4gb. Để sử dụng kích thước heap lớn hơn, bạn cần sử dụng JVM 64 bit. Hãy thử như sau:

java -Xmx6144M -d64

Cờ -d64 rất quan trọng vì điều này báo cho JVM chạy ở chế độ 64 bit.


Cảm ơn sếp nhưng nó không hoạt động trong hệ thống của tôi. Tôi còn thiếu một thứ nữa
Sunil

4
Xác định "không hoạt động". Nó không bắt đầu và cung cấp cho bạn một lỗi? Nó bắt đầu nhưng sử dụng một kích thước heap khác nhau?
Kevin

11

Có thể tăng kích thước heap được phân bổ bởi JVM trong nhật thực trực tiếp Trong goto IDE nhật thực

Chạy ----> Chạy cấu hình ----> Đối số

Nhập -Xmx1g (Nó được sử dụng để đặt kích thước tối đa như Xmx256m hoặc Xmx1g ...... m -> mb g ---> gb)


3
Chỉ cần thêm điều này là một đối số VM (nhật thực cung cấp cho bạn hai tùy chọn).
Matt Boyle

11

java -d64 -Xms512m -Xmx4g HelloWorld

trong đó, -d64: Sẽ kích hoạt JVM 64 bit -Xms512m: Sẽ đặt kích thước heap ban đầu là 512 MB -Xmx4g: Sẽ đặt kích thước heap tối đa là 4 GB (ở đây tên tệp java là: HelloWorld.java)


9

Bạn có thể tăng Kích thước Heap bằng cách chuyển các tham số JVM -Xms-Xmx như bên dưới:

Đối với tệp Jar:

java -jar -Xms4096M -Xmx6144M jarFilePath.jar

Đối với các tệp Java:

 java -Xms4096M -Xmx6144M ClassName

Các tham số trên tăng kích thước ban đầu (-Xms) lên 4GB (4096 MB) và MaxHeapSize (-Xmx) lên 6GB (6144 MB).

Tuy nhiên, Kích thước HeapS thế hệ trẻ sẽ giữ nguyên và HeapSize bổ sung sẽ được thêm vào Kích thước Heap thế hệ cũ . Để cân bằng kích thước của Young Gen Heap và Old Gen Heap , hãy sử dụng -XX: NewRatio = 1 -XX: -UseAdaptiveSizePolicy params.

java -jar -Xms4096M -Xmx6144M -XX:NewRatio=1 -XX:-UseAdaptiveSizePolicy pathToJarFile.jar

-XX: NewRatio = Old Gen Heap Size: Young Gen HeapSize (Bạn có thể chơi với tỷ lệ này để có được tỷ lệ mong muốn của bạn).


7

Tôi có thể tăng bộ nhớ heap lên 75% bộ nhớ vật lý (6GB Heap) không.

Có bạn có thể. Trong thực tế, bạn có thể tăng lên nhiều hơn số lượng bộ nhớ vật lý, nếu bạn muốn.

Cho dù đó là một ý tưởng tốt để làm điều này phụ thuộc vào số lượng khác đang chạy trên hệ thống của bạn. Đặc biệt, nếu "bộ công việc" của các ứng dụng và dịch vụ hiện đang chạy vượt quá đáng kể bộ nhớ vật lý khả dụng, thì hệ thống của bạn có khả năng bị "giật", mất nhiều thời gian để di chuyển các trang bộ nhớ ảo đến và từ đĩa. Hiệu quả ròng là hệ thống bị chậm kinh khủng.


Cảm ơn bình luận của bạn Nhưng làm thế nào tôi có thể tăng lên. Bạn có thể ra lệnh.
Sunil

Hãy thử -Xmx6000m. Nó nên hoạt động nếu bạn đang sử dụng phiên bản Java 64 bit.
Stephen C

3
Bạn có chắc chắn rằng bạn đang chạy phiên bản Java 64 bit không? Trên hệ điều hành 64 bit?
Stephen C

4

Vui lòng sử dụng lệnh bên dưới để thay đổi kích thước heap thành 6GB

export JAVA_OPTS="-Xms6144m -Xmx6144m -XX:NewSize=256m -XX:MaxNewSize=356m -XX:PermSize=256m -XX:MaxPermSize=356m"

Nếu tôi có bộ nhớ 8G trong hệ thống của mình và tôi có thể thấy từ trình quản lý tác vụ thay đổi 70% số đó đang được sử dụng; điều này có thể phân bổ bộ nhớ 6G cho kích thước heap java không?
Reihan_amn

1
@Reihan_amn Có và không, nếu bạn vượt quá bộ nhớ, nó sẽ chuyển sang phân trang, trên đĩa và cực kỳ chậm. Nếu bạn vượt quá các tệp trang thì bạn đang ở trong một thời gian xấu.
CodeMonkey

2

Một số người đã chỉ ra các câu trả lời cụ thể cho kích thước heap với các tùy chọn jvm của -Xms-Xms. Tôi muốn chỉ ra rằng đây không phải là loại tùy chọn bộ nhớ duy nhất cho jvm. Cụ thể nếu bạn nhận được ngăn xếp qua các luồng, thì bạn sẽ muốn tăng kích thước của ngăn xếp bằng cách thêm một tùy chọn bổ sung như -Xss8m.

Đối với vấn đề này, các tùy chọn jvm của một cái gì đó giống như -Xms2g -Xmx6g -Xss8msẽ là một giải pháp.

Tôi đang chia sẻ thông tin này khi các tìm kiếm trên google của tôi về cách tăng bộ nhớ jvm đã đưa tôi đến giải pháp này và các giải pháp không hoạt động với số lượng phân bổ bộ nhớ cao. Khi tôi tìm ra các cài đặt cụ thể để làm gì, tôi có thể google cách tăng kích thước ngăn xếp và tìm thấy thông số bị thiếu. :) Hy vọng điều này sẽ giúp người khác tiết kiệm thời gian, vì nó sẽ giúp tôi tiết kiệm rất nhiều thời gian. :)


2

Điều này chỉ hoạt động với phiên bản 64 bit của Java. Chuyển đến Bảng điều khiển và nhấp vào biểu tượng Java. Trên cửa sổ nhỏ của Bảng điều khiển Java, nhấp vào thanh trình đơn Java và sau đó nhấp vào viewnút.

Nếu bạn có hai nền tảng Java, hãy vô hiệu hóa phiên bản Java trước đó, sau đó nhấp vào trường văn bản Tham số thời gian chạy và ghi -Xmx1024mhoặc nhỏ hơn kích thước RAM. Đừng tăng kích thước heap bằng RAM nếu không hệ thống của bạn sẽ gặp sự cố.


Nếu bạn thực hiện kích thước heap bằng RAM, hệ thống sẽ không gặp sự cố. Thay vào đó, hệ thống sẽ bắt đầu phân trang và nhận được tốt đẹp và chậm.
DaveTheMinion

0

Đúng. Bạn có thể.

Bạn có thể tăng bộ nhớ heap của mình lên 75% bộ nhớ vật lý (Heap 6 GB) hoặc cao hơn.

Vì Bạn đang sử dụng 64 bit, bạn có thể tăng kích thước heap của mình lên số tiền bạn muốn. Trong trường hợp bạn đang sử dụng 32 bit, nó bị giới hạn ở 4GB.

$ java -Xms512m -Xmx6144m JavaApplication

Đặt cho bạn kích thước heap ban đầu là 512mb và heapsize tối đa thành 6GB.

Hy vọng nó giúp.. :)


Điều này có vẻ rất giống với hai câu trả lời được bình chọn hàng đầu được đăng một vài năm trước đó.
Bernhard Barker

0

Tôi gặp vấn đề khi chạy các tệp py trong mã java của mình bằng cách sử dụng nhật thực / STS, nhận PyException do bộ nhớ heap jvm không đủ. Tôi đã thực hiện các thay đổi như được đề cập dưới đây và tôi có thể giải quyết vấn đề này. Dưới đây là cấu hình hệ thống của tôi.

nhập mô tả hình ảnh ở đây

Và đây là những thay đổi tôi đã làm trong không gian làm việc của mình và bây giờ nó chạy hoàn hảo.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

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.