Tăng kích thước heap tối đa JVM cho các ứng dụng thâm dụng bộ nhớ


88

Tôi cần chạy ứng dụng tăng cường bộ nhớ Java sử dụng hơn 2GB, nhưng tôi đang gặp sự cố để tăng kích thước tối đa của heap. Cho đến nay, tôi đã thử các cách tiếp cận sau:

  • Đặt tham số -Xmx, ví dụ -Xmx3000m. Phương pháp này không thành công khi tạo JVM. Từ những gì tôi đã tìm kiếm trên Google, có vẻ như -Xmx phải nhỏ hơn 2GB.

  • Sử dụng tùy chọn -XX: + AggressionHeap . Khi tôi thử phương pháp này, tôi gặp lỗi 'Không đủ bộ nhớ' cho biết kích thước heap là 1273,4 MB, mặc dù máy tính của tôi có bộ nhớ 8GB.

Có cách tiếp cận nào khác mà tôi có thể thử để tăng kích thước đống tối đa của JVM không? Dưới đây là tóm tắt về thông số kỹ thuật máy tính:

  • Hệ điều hành: Windows 7 (64 bit)
  • Bộ xử lý: Intel Core i7 (2,66 GHz)
  • Bộ nhớ: 8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: Kích thước bộ nhớ tối thiểu và tối đa hiện là các tùy chọn tiêu chuẩn. Bạn có thể sử dụng -ms và -mx thay vì -Xms và -Xmx. -X ?? được dành riêng cho các tùy chọn không tiêu chuẩn.
Peter Lawrey

2
Tiêu chuẩn cho JVM nào? Chúng vẫn không phải là tiêu chuẩn cho HotSpot JVM (kể từ ngày 1.8). Xem docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx và -ms tồn tại và hoạt động, nhưng tôi không thể tìm thấy nó trong tài liệu java chính thức @PeterLawrey> bạn có thể thêm liên kết đến tài liệu không? Cảm ơn
Michal Bernhard

2
@MichalBernhard nó tương thích ngược với Java 1.1. Tôi đã thấy nó được ghi lại cho phiên bản đó nhưng có thể khó tìm thấy bây giờ. ;)
Peter Lawrey

1
Cảm ơn @PeterLawrey đã giải thích. Nhưng khi bạn nói nó chuẩn bây giờ, bạn có nghĩa là nó chuẩn từ Java 1.1 (nhưng không phải là tài liệu trong các phiên bản sau)? Có vẻ kỳ lạ :) btw Tôi tìm thấy liên kết trên Java 1.1 tài liệu và bạn là đúng: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/...
Michal Bernhard

Câu trả lời:



96

Khi bạn đang sử dụng JVM ở chế độ 32-bit, kích thước heap tối đa có thể được cấp phát là 1280 MB. Vì vậy, nếu bạn muốn vượt qua điều đó, bạn cần phải gọi JVM ở chế độ 64.

Bạn có thể sử dụng sau:

$ java -d64 -Xms512m -Xmx4g HelloWorld

Ở đâu,

  • -d64: Sẽ bật JVM 64-bit
  • -Xms512m: Sẽ đặt kích thước heap ban đầu là 512 MB
  • -Xmx4g: Sẽ đặt kích thước đống tối đa là 4 GB

Bạn có thể điều chỉnh -Xms và -Xmx theo yêu cầu của bạn (YMMV)

Một tài nguyên rất tốt về điều chỉnh hiệu suất JVM mà bạn có thể muốn xem: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


JVM của tôi là 32-bit và cho phép tối đa -Xmx1024M. Cũng sẽ dùng thử phiên bản 64bit.
kiltek

Tôi đã thử JVM 64-bit và nó hoạt động hoàn hảo. Bây giờ tôi có thể đặt 4096 MB kích thước đống tối đa. Khi bạn đã cài đặt cả 32 và 64 bit, ít nhất trên Windows, bạn cần trỏ đường dẫn Java cho các ứng dụng của mình đến phiên bản 64 bit mới được cài đặt. Nếu không, lỗi sẽ vẫn tồn tại. Trên Windows, điều này thường có thể được thực hiện bằng cách thay đổi đường dẫn Java trên Biến môi trường của hệ thống.
Fabiano

Tôi đoán giới hạn cho đống tối đa không phải là 1280, mà là gần 1700MB. Tôi đã sử dụng 1600MB heap tối đa trên bản cài đặt JVM 32 bit của mình và nó hoạt động tốt.
Fabiano

đối số HelloWorld trong lệnh của bạn là gì? làm thế nào tôi có thể sử dụng lệnh này nếu tôi muốn đặt mức tối đa của một quy trình Java được bắt đầu bằng lệnh java -jar myApp.jar trên linux?
LordScone

Xin chào, cho tôi hỏi kích thước heap java tối đa mà tôi có thể đặt là bao nhiêu? Khi tôi chạy ứng dụng, defaul -Xmx trên máy của tôi là 4GB, nhưng tôi có thể đặt nó hơn 4GB được không?
Ock,

14

Tôi tin rằng giới hạn 2GB là dành cho Java 32-bit. Tôi nghĩ v1.6 luôn là 64 bit, nhưng hãy thử buộc chế độ 64 bit chỉ để xem: thêm tùy chọn -d64.


Tùy chọn -D64 không hoạt động, tôi sẽ thử sử dụng JVM 64 bit như GregS đã đề xuất và báo cáo kết quả.
Alceu Costa

1
Các công tắc -d64 và -d32 chỉ hoạt động chính xác trên Solaris (ít nhất là theo tài liệu này): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach

Tôi đã thử với cả hai tùy chọn. Với -d64, JVM không thể khởi chạy ngay cả khi tôi không chỉ định tùy chọn Xmx. -D64 chỉ hoạt động khi tôi không chỉ định Xmx.
Alceu Costa

@Lukasz -d64 và -d32 dường như cũng hoạt động trên JVM của Apple. Nhưng tài liệu đó dường như ngụ ý rằng chúng không có chức năng đối với các JVM Windows & Linux của Sun.
G__ Ngày

8

Java 32-bit được giới hạn trong khoảng 1,4 đến 1,6 GB.

Câu hỏi thường gặp về heap 32 bit của Oracle

Trích dẫn

Giới hạn đống lý thuyết tối đa cho JVM 32-bit là 4G. Do các ràng buộc bổ sung khác nhau như hoán đổi có sẵn, sử dụng không gian địa chỉ hạt nhân, phân mảnh bộ nhớ và chi phí VM, trên thực tế, giới hạn có thể thấp hơn nhiều. Trên hầu hết các hệ thống Windows 32-bit hiện đại, kích thước heap tối đa sẽ nằm trong khoảng từ 1,4G đến 1,6G. Trên hạt nhân Solaris 32-bit, không gian địa chỉ được giới hạn ở 2G. Trên hệ điều hành 64-bit chạy VM 32-bit, kích thước đống tối đa có thể cao hơn, đạt tới mức 4G trên nhiều hệ thống Solaris.


4

Dưới đây conf làm việc cho tôi:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
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.