Khắc phục: Lỗi xảy ra trong quá trình khởi tạo VM không thể dành đủ không gian cho đống đối tượng

Mặc dù các ứng dụng Java ngày nay không phải là một công nghệ web phổ biến, nhưng có vô số lý do để triển khai một máy ảo Java trực tiếp trên một máy chủ Linux. Nếu bạn cố gắng chạy hoàn toàn lệnh java Linux trên phần cứng rời hoặc bên trong máy ảo của chính nó, thì bạn có thể gặp phải thông báo “xảy ra lỗi trong quá trình khởi tạo máy ảo không thể dành đủ dung lượng cho đống đối tượng”.

Điều này có thể trông khá kỳ quặc vì nhiều khả năng bạn có đủ RAM để chạy lệnh, nhưng phần lớn là do một vấn đề cụ thể trong cách sử dụng các trang bộ nhớ vật lý và ảo. Việc chỉ định một số kích thước tương đối lớn sẽ cho phép bạn hoàn toàn bỏ qua thông báo này và chạy lệnh java theo cách bạn làm.

Phương pháp 1: Sử dụng Tùy chọn Dòng lệnh

Nếu bạn đã cố gắng chạy java và nhận được thông báo này, thì có thể bạn đã chạy lệnh miễn phí để đảm bảo rằng có nhiều nguồn cung cấp bộ nhớ để chạy chương trình.

java và lệnh miễn phí

Lưu ý rằng trên máy thử nghiệm của chúng tôi, chúng tôi có khoảng 2,3 GB RAM vật lý và chưa có một trang bộ nhớ ảo nào được sử dụng. Nếu bạn nhận thấy rằng bạn bị lỗi bộ nhớ, thì bạn sẽ muốn đóng những thứ khác mà bạn đang chạy trước khi thử lại. Mặt khác, những người nhận thấy rằng họ có nhiều bộ nhớ trống có thể cố gắng chỉ định kích thước trực tiếp.

Ví dụ: trên máy tính của chúng tôi, chúng tôi có thể chạy lệnh dưới dạng java -Xms256m -Xmx512M và nó hoạt động như mong đợi. Điều này hạn chế kích thước heap mà máy ảo Java cố gắng dự trữ khi khởi động. Vì một máy ảo không bị kiềm chế theo giả thuyết có thể làm những điều bất thường, nó có thể đưa ra các thông báo lỗi trên một hệ thống miễn phí khác. Bạn cũng có thể muốn thử với hai giá trị đó trước khi tìm được sự kết hợp phù hợp.

Đây có thể là một vấn đề bất kể bạn đang chạy nó bằng gì vì JVM không liên quan gì đến loại máy ảo bạn có thể đang sử dụng để chạy GNU / Linux.

Phương pháp 2: Xuất các biến để thực hiện thay đổi vĩnh viễn

Khi bạn tìm thấy một giá trị phù hợp, bạn có thể xuất giá trị đó để đặt nó vĩnh viễn cho phiên đó. Ví dụ: chúng tôi đã sử dụng export _JAVA_OPTIONS = '- Xms256M -Xmx512M' từ dấu nhắc lệnh bash và nó cho phép chúng tôi tự chạy lệnh java mà không có bất kỳ tùy chọn nào khác cho đến khi chúng tôi đăng xuất khỏi máy chủ của mình.

Nó cần được chạy lại khi chúng tôi đăng nhập vào một phiên khác, vì vậy bạn có thể muốn thêm nó vào bất kỳ tập lệnh khởi động nào có liên quan nếu bạn định sử dụng lệnh java khá thường xuyên. Chúng tôi đã thêm dòng vào tệp .bash_login của mình và nó dường như hoạt động mỗi khi chúng tôi sử dụng lời nhắc đăng nhập mà không cần phải chạy lại, mặc dù bạn có thể phải tìm một vị trí khác cho nó nếu bạn đang làm việc với một trình bao khác.

Bạn có thể nhận thấy rằng chỉ một số cấu hình phần cứng nhất định mới kích hoạt thông báo lỗi này. Đó là bởi vì nó thường xảy ra trên các máy có nhiều RAM vật lý nhưng độ phân giải thấp hơn về cách sử dụng nó. Java sẽ cố gắng phân bổ một khối lớn chỉ để được thông báo rằng nó không thể, điều mà nó diễn giải là hết bộ nhớ.

Phương pháp 3: In các tùy chọn Java hiện tại

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

Hãy nhớ rằng mặc dù bản sửa lỗi này không yêu cầu bất kỳ thao tác nào khác, nhưng Java sẽ đưa ra thông báo “không thể dành đủ dung lượng cho đống đối tượng” nếu bạn thực sự thấy mình đang thiếu bộ nhớ ảo. Nếu đúng như vậy, bạn sẽ muốn kiểm tra kỹ xem các quy trình nào hiện đang chạy và có thể khởi động lại máy chủ nếu đó là một tùy chọn. Bạn cũng có thể tạo thêm không gian hoán đổi, nhưng nếu đây là vấn đề thì tốt hơn hết là bạn nên thử và sửa nó theo cách khác.

Trong trường hợp hiếm hoi mà cài đặt của bạn có vẻ đúng nhưng nó vẫn không hoạt động, hãy đảm bảo bạn đã cài đặt gói Java 64-bit vì gói này sẽ không bị sự cố này. Các yêu cầu về bộ nhớ liền kề chỉ áp dụng cho phiên bản Java 32-bit. Trong một số ít trường hợp, phiên bản 64-bit đã cố gắng tạo một máy ảo 32-bit, vì vậy việc chỉ định tùy chọn -d64 trên dòng lệnh đã khắc phục sự cố đó cho chúng tôi.