Computer >> Hướng Dẫn Máy Tính >  >> Xử Lý Sự Cố >> Linux

Sửa lỗi: "Error occurred during initialization of VM could not reserve enough space for object heap" trên Java

Mặc dù Java applet không còn là công nghệ web phổ biến ngày nay, vẫn có vô số lý do để triển khai máy ảo Java (JVM) trực tiếp trên máy chủ Linux. Nếu bạn thử chạy lệnh java trên Linux — चाह phần cứng rời rạc hay bên trong VM riêng — bạn có thể gặp thông báo: "error occurred during initialization of VM could not reserve enough space for object heap" (lỗi khi khởi tạo VM: không thể dành đủ không gian cho object heap).

Điều này trông khá lạ vì bạn chắc chắn có đủ RAM để chạy lệnh, nhưng nguyên nhân chủ yếu do một đặc thů trong cách các trang nhớ vật lý và ảo được sử dụng. Việc chỉ định kích thước heap lớn hơn sẽ giúp bạn bỏ qua thông báo này và chạy lệnh java như bình thường.

Cách 1: Sử dụng tùy chọn dòng lệnh

Nếu bạn đã thử chạy java và nhận được thông báo này, bạn chắc đã chạy lệnh free để kiểm tra bộ nhớ trống.

Sửa lỗi:  Error occurred during initialization of VM could not reserve enough space for object heap  trên Java

Trên máy test của chúng tôi có khoảng 2,3 GB RAM vật lý và chưa dùng một trang nhớ ảo nào. Nếu bạn thấy thiếu hụt bộ nhớ, hãy đóng các chương trình khác trước khi thử lại. Ngược lại, nếu thấy còn nhiều RAM trống, hãy thử chỉ định kích thước heap trực tiếp.

Ví dụ, trên máy của chúng tôi, lệnh java -Xms256m -Xmx512M chạy ngon lành. Điều này giới hạn kích thước heap mà JVM cố gắng dành riêng khi khởi động. Vì một JVM không bị giới hạn có thể làm những việc bất ngờ, nó có thể ném lỗi trên hệ thống bình thường. Bạn có thể thử nghiệm với hai giá trị này cho đến khi tìm được tổ hợp phù hợp.

Vấn đề này xảy ra bất kể bạn chạy trên nền tảng gì, vì JVM không liên quan đến loại VM bạn dùng để chạy GNU/Linux.

Cách 2: Xuất biến môi trường để thay đổi vĩnh viễn (cho phiên làm việc)

Khi tìm được giá trị hoạt động, bạn có thể xuất nó để có hiệu lực vĩnh viễn trong phiên đó. Ví dụ, chúng tôi dùng export _JAVA_OPTIONS='-Xms256M -Xmx512M' từ dòng lệnh bash và sau đó có thể chạy java đơn lẻ mà không cần tùy chọn khác cho đến khi đăng xuất.

Lệnh này cần chạy lại khi đăng nhập phiên mới, nên bạn có thể thêm vào script khởi động phù hợp (ví dụ .bash_login) nếu thường xuyên dùng lệnh java. Chúng tôi thêm dòng đó vào .bash_login và nó hoạt động mỗi lần đăng nhập qua prompt, tuy nhiên với shell khác bạn có thể phải tìm vị trí khác.

Bạn có thể nhận thấy chỉ một số cấu hình phần cứng mới kích hoạt lỗi này. Đó là vì thường xảy ra trên máy có nhiều RAM vật lý nhưng ulimit thấp cho việc sử dụng. Java cố cấp phát khối lớn nhưng bị từ chối, và hiểu nhầm là hết bộ nhớ.

Cách 3: In các tùy chọn Java hiện tại

Nếu bạn đang làm việc trên dòng lệnh và muốn tham khảo nhanh giá trị _JAVA_OPTIONS hiện tại, chỉ cần chạy echo $_JAVA_OPTIONS — nó sẽ in ra giá trị ngay lập tức. Điều này hữu ích khi troubleshooting để tìm con số phù hợp.

Lưu ý: Mặc dù cách sửa này thường không cần can thiệp thêm, Java vẫn sẽ ném lỗi "could not reserve enough space for object heap" nếu bạn thực sự thiếu hụt bộ nhớ ảo. Lúc đó bạn nên kiểm tra các tiến trình đang chạy và cân nhắc khởi động lại server nếu có thể. Bạn cũng có thể tạo thêm swap space, nhưng nếu gặp vấn đề này, tốt hơn nên sửa gốc rễ theo cách khác.

Trong trường hợp hiếm gặp: cài đặt đúng nhưng vẫn không chạy, hãy chắc chắn bạn đã cài gói Java 64-bit vì nó miễn dịch với vấn đề này. Yêu cầu bộ nhớ liền mạch chỉ áp dụng cho Java 32-bit. Chúng tôi từng gặp vài trường hợp bản 64-bit cố tạo VM 32-bit, thêm tùy chọn -d64 vào dòng lệnh đã khắc phục.