Đặt không gian đống Java trong Maven 2 trên Windows


91

Tôi nhận được thông báo này trong quá trình xây dựng dự án của mình

java.lang.OutOfMemoryError: Java heap space

Làm cách nào để tăng dung lượng heap, tôi có 8Gb hoặc RAM không thể mà maven tiêu thụ nhiều như vậy, tôi tìm thấy cái này http://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux / cách thực hiện trên linux, nhưng tôi đang sử dụng windows 7. Làm cách nào để thay đổi không gian heap java trong windows?


Tôi giả sử bạn đang sử dụng phiên bản Windows 64bit? Nếu không, bạn sẽ không chỉ định bất kỳ nhiều hơn 1.5G làm kích thước heap, các cửa sổ 0.5G khác cho phép bạn sử dụng trực tiếp sẽ được JVM yêu cầu. Có một tùy chọn để cửa sổ chỉ sử dụng 1G cho mã chế độ kernal và 3G cho mã chế độ người dùng, nhưng mặt trời JVM sẽ không cho phép bạn sử dụng nó.
vickirk

@vickirk Tôi đang sử dụng phiên bản 64bit của windows
Gandalf StormCrow

1
Bạn cũng đang sử dụng phiên bản 64-bit của JVM? Nó sẽ được liệt kê là Windows x64 trong danh sách thả xuống trên trang tải xuống JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

Câu trả lời:


117

MAVEN_OPTSVí dụ, biến môi trường cần đặt là MAVEN_OPTS=-Xmx1024m. Các maxmemcấu hình trong pom chỉ áp dụng khi bạn thiết lập các plugin trình biên dịch để nĩa javacvào một JVM mới. Nếu không, plugin sẽ chạy bên trong cùng một máy ảo với Maven và do đó trong bộ nhớ được truyền trên dòng lệnh thông qua MAVEN_OPTS.

Để đặt MAVEN_OPTS trong Windows 7:

  1. Nhấp chuột phải vào Máy tính của tôi và chọn Thuộc tính (phím tắt nhấn Windows+ Pause/Break)
  2. Nhấp vào liên kết Cài đặt Hệ thống Nâng cao nằm trong điều hướng bên trái của Thuộc tính Hệ thống để hiển thị Thuộc tính Hệ thống Nâng cao
  3. Đi đến nâng cao tab và nhấp vào các Environment Variables nút nằm ở dưới cùng của Advanced System Properties cửa sổ cấu hình
  4. Tạo biến người dùng mới , đặt tên biến thành MAVEN_OPTS và đặt giá trị biến thành -Xmx1024m(hoặc hơn)

Mở một cửa sổ lệnh mới và chạy mvn.


1
Điều này có ảnh hưởng gì đến tốc độ xây dựng của tôi không? Có mẹo nào để tăng cường bản dựng maven của tôi với việc phân bổ thêm bộ nhớ cho nó không?
Mahendran

45

Nếu bạn sắp hết dung lượng heap trong quá trình chạy thử nghiệm JUnit chắc chắn (hoặc an toàn dự phòng), việc thay đổi MAVEN_OPTS có thể không giúp ích cho bạn. Tôi tiếp tục thử các cấu hình khác nhau trong MAVEN_OPTS mà không gặp may cho đến khi tôi tìm thấy bài đăng này đã khắc phục sự cố.

Về cơ bản, các JUnits chuyển sang môi trường riêng của chúng và bỏ qua các cài đặt trong MAVEN_OPTS. Bạn cần cấu hình chắc chắn trong pom của mình để thêm bộ nhớ cho JUnits.

Hy vọng rằng điều này có thể tiết kiệm thời gian cho người khác!


Chỉnh sửa: Sao chép giải pháp từ blog của Keith Chapman đề phòng trường hợp liên kết bị hỏng vào một ngày nào đó:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

Cập nhật (31/5/2017): Cảm ơn @johnstosh đã chỉ ra điều này - chắc chắn là đã phát triển một chút kể từ khi tôi đưa ra câu trả lời này. Đây là một liên kết đến tài liệu của họ và một mẫu mã được cập nhật (dòng arg vẫn là phần quan trọng cho câu hỏi này):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>

Nó đã tiết kiệm một số thời gian của tôi! Cảm ơn! Thật không may, tôi chỉ có thể ủng hộ một lần! :)
javanna

Đây là câu trả lời hữu ích nhất giữa những người khác, theo phong cách maven thực sự. Cảm ơn!
Andremoniy

Đây là câu trả lời thực tế cho câu hỏi
Jonathan Landrum

1
Xem các tài liệu về chắc chắn. Các phiên bản surefire trước 2.14 đã sử dụng tham số forkMode để cấu hình forking. Mặc dù tham số đó vẫn được hỗ trợ để tương thích ngược, người dùng được khuyến khích di chuyển cấu hình của họ và sử dụng forkCount và reuseForks để thay thế.
johnstosh

21

Nó phải là lệnh giống nhau, ngoại trừ SET thay vì EXPORT

  • set MAVEN_OPTS = -Xmx512m sẽ cung cấp cho nó 512Mb đống
  • set MAVEN_OPTS = -Xmx2048m sẽ cung cấp cho nó 2Gb đống

Tôi đồng ý rằng nó phải là cùng một lệnh, nhưng điều đó không làm cho nó đúng, đây là lý do tại saoC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow

glowcoder hơi sai. Bạn không cần XUẤT các biến, nhưng để gán giá trị cho chúng, bạn cần đặt.
JeremyP

Bạn cũng có thể đặt MAVEN_OPTS làm biến môi trường windows nếu bạn muốn sử dụng các giá trị giống nhau cho mọi bản dựng.
digitaljoel

@Gandalf bạn cần đặt bộ ở trước nó @Jeremy vâng, đó là lý do tại sao nó nói sử dụng bộ thay vì xuất
corsiKa

9

Trên Mac: Thay vì JAVA_OPTSMAVEN_OPTS, hãy sử dụng _JAVA_OPTIONS. Những công việc này!


điều này cũng hoạt động trên các cửa sổ. Thêm biến này làm biến môi trường trong cấu hình chạy maven trong nhật thực, các thử nghiệm chạy từ m2e không còn đưa ra lỗi PermGen nữa
Liên kết

3

Sau khi cố gắng sử dụng biến MAVEN_OPTS mà không gặp may, tôi đã tìm thấy trang web này phù hợp với tôi. Vì vậy, tất cả những gì tôi phải làm là thêm -Xms128m -Xmx1024m vào các tùy chọn VM mặc định và nó đã hoạt động.

Để thay đổi những điều đó trong Eclipse, hãy đi tới Window -> Preferences -> Java -> Installed JREs. Chọn JRE / JDK đã chọn và nhấp vào chỉnh sửa.


0

Trên cửa sổ:

Thêm một biến môi trường (trong cả biến hệ thống và biến của người dùng, tôi có một số vấn đề kỳ lạ là nó lấy var từ nhiều nơi khác nhau, vì vậy tôi thêm chúng vào cả hai biến).

Đặt tên là MAVEN_OPTS.

Giá trị sẽ là: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

Các con số có thể khác nhau, hãy làm cho chúng tương đối với kích thước mem của bạn.

Tôi đã gặp sự cố đó và điều này đã khắc phục nó, không có gì khác!


0

Nó hoạt động - Để thay đổi trong Eclipse, hãy đi tới Window -> Preferences -> Java -> Installed JREs. Chọn JRE / JDK đã chọn và nhấp vào chỉnh sửa.

Đối số VM mặc định = -Xms128m -Xmx1024m


-7

Bạn đang tìm kiếm 2 lựa chọn để java:

  • -Kích thước đống tối đa xmx
  • -Xms kích thước đống bắt đầu

Đặt chúng trong lệnh gọi javatệp thực thi của bạn, như sau:

java -Xms512M -Xmx1024M my.package.MainClass

Hãy nhớ rằng bạn có thể muốn kích thước heap bắt đầu và tối đa giống nhau, tùy thuộc vào ứng dụng, vì nó tránh thay đổi kích thước heap trong thời gian chạy (có thể mất thời gian trong các ứng dụng cần phản hồi). Thay đổi kích thước đống có thể dẫn đến việc di chuyển nhiều đối tượng xung quanh và thực hiện lại việc ghi sổ kế toán.

Đối với các dự án hàng ngày, hãy làm cho chúng bất cứ thứ gì bạn nghĩ là đủ tốt. Hồ sơ để được giúp đỡ.


1
như ebelisle tuyên bố, các tùy chọn này sẽ không hoạt động chút nào vì bạn, khi sử dụng Maven, phải chỉ định ít nhất đó là tùy chọn Maven với "-D" nhưng vẫn không phải là lệnh java mà chúng ta đang nói
frandevel
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.