2016-12-28 27 views
7

Chúng tôi đang sử dụng SBT 0.13 và Java 8 JVM trên CircleCI để xây dựng ứng dụng Play với một số tiểu dự án. Đôi khi chúng tôi gặp phải vấn đề về bộ nhớ trên CircleCI, nơi nó hủy bỏ bản dựng của chúng tôi vì nó vượt quá 4 GB dung lượng bộ nhớ.SBT hết bộ nhớ với các tiểu dự án

Hôm qua, tôi đã thêm một tiểu dự án mới vào bản dựng của chúng tôi và hầu như tất cả các bản dựng đều không thành công trong vấn đề bộ nhớ. Dường như việc thêm các dự án con cũng tăng thêm lượng bộ nhớ được sử dụng cho bản dựng của chúng tôi.

Tôi đã thử một vài điều để giảm tải bộ nhớ của chúng tôi:

  • Thêm _JAVA_OPTIONS: "-Xms512m -Xmx2048"-circle.yml như mô tả trên CircleCI's documentation pages. (Tôi nhận thấy từ nhật ký mà JVM thực hiện trên thiết lập này.)
  • Thêm tham số -mem vào cuộc gọi SBT.
  • Thêm concurrentRestrictions in Global += Tags.limit(Tags.Test, 1) vào đầu tệp SBT, để đảm bảo rằng ít nhất bộ nhớ không được sử dụng cùng một lúc.

Tất cả các biện pháp này dường như đã giúp, nhưng tôi chưa tìm ra giải pháp dứt khoát cho vấn đề này.

Tôi còn có thể làm gì khác để kiểm soát mức sử dụng bộ nhớ của SBT?

EDIT: Dự án của chúng tôi có 5 tiểu dự án, với khoảng 14000 dòng mã Scala (và cũng có, 21.000 dòng mã Java mà chúng tôi 'kế thừa'). Bộ nhớ ngoài thường (nhưng không phải luôn luôn) xảy ra khi thực hiện phân tích tĩnh bằng FindBugs: chúng tôi sử dụng kết hợp với plugin FindSecurityBugs để tìm các vấn đề bảo mật.

+0

Dự án của bạn lớn đến mức nào? bạn có bao nhiêu dòng mã?khi nào bạn nhận được OOM về biên dịch? bao bì? giai đoạn thử nghiệm? – Rumoku

+0

@rumoku Câu hỏi hay; Tôi đã chỉnh sửa câu hỏi của mình để trả lời chúng. – jqno

+0

Bạn đang gặp sự cố trong một giai đoạn khác với câu hỏi khác này, nhưng nó có thể giúp bạn: http://stackoverflow.com/questions/16640823/sbt-runs-out-of-memory?rq=1 – 2rs2ts

Trả lời

1

Có hai vấn đề ở đây là đang nhận được hỗn hợp:

  1. Vòng CI không chọn lên giá trị cho giới hạn bộ nhớ

  2. SBT sử dụng một số tiền quá nhiều bộ nhớ

Đầu tiên vấn đề phải được giải quyết khi xem tài liệu/ví dụ của CircleCI. Để điều tra lý do bạn sử dụng quá nhiều bộ nhớ, bạn có thể chạy sbt cục bộ với giới hạn bộ nhớ thấp hơn 4g (tức là 2g). Bạn sẽ thấy mình thuộc một trong hai trường hợp sau:

  1. Thử nghiệm của bạn thực sự đang sử dụng quá nhiều bộ nhớ, có thể do rò rỉ bộ nhớ. JVM của bạn thoát vì một số java.lang.OutOfMemoryError: GC overhead limit exceeded. Bạn nên chạy bản dựng cục bộ với một trình lược tả và xem điều gì gây ra sự cố cho bạn (các kết nối cơ sở dữ liệu không bị đóng?)

  2. Các thử nghiệm của bạn đang sử dụng quá nhiều bộ nhớ do SBT có khả năng nạp lại các lớp động: trong SBT để nạp lại hoàn toàn lớp bên trong cùng một JVM (ví dụ: bạn có thể khởi chạy giao diện điều khiển, tải lớp, chỉnh sửa tệp, biên dịch lại và khởi chạy lại bảng điều khiển và tải lại lớp). Như được mô tả trong tài liệu Oracle ở đây, không có giới hạn cho Maximum MetaSpace trong Java 8 và bạn nên đặt một sao cho heap + metaspace của bạn < 4gb. Xem https://blogs.oracle.com/poonam/entry/about_g1_garbage_collector_permanent

+0

1. Tôi đã làm tất cả những điều tôi liệt kê trong câu hỏi tại địa phương là tốt. Tôi đã giới hạn tất cả mọi thứ đến 1,5G, nhưng mỗi khi tôi nhìn thấy bộ nhớ đi cao tới 2,5G. Tôi đã làm hồ sơ của một người đàn ông nghèo bằng cách sử dụng 'top' trong một thiết bị đầu cuối, mặc dù tôi biết đó không phải là cách đúng đắn để làm điều đó. 2. Tôi không biết về điều metaspace này. Tôi chắc chắn sẽ thử điều đó! Mặc dù tôi chỉ đang chạy 'sbt test' và để các tệp một mình trong khi nó chạy. – jqno

+0

Nghề nghiệp JVM không chỉ là đống mà còn bao gồm cả MetaSpace nữa. Các bài kiểm tra của bạn có thành công không bằng cách giới hạn bộ nhớ thành 2g heap? – Edmondo1984

+0

Tôi chưa cố gắng đặt metaspace một cách rõ ràng (mặc dù, từ những gì tôi hiểu, công tắc '-mem' của SBT nên xử lý điều đó). Tôi sẽ cố gắng đặt '-XX: MetaspaceSize' sau ngày hôm nay và báo cáo lại. – jqno

Các vấn đề liên quan