2009-06-23 26 views
21

Tôi có một ứng dụng java sử dụng khoảng 15G trên một máy có 16G. Tôi không biết liệu tôi có nên đặt kích thước heap tối đa không.Ứng dụng Java sử dụng nhiều bộ nhớ. Sử dụng -Xmx?

Nếu đặt jvm sẽ ăn tất cả ram lên đến giới hạn và sau đó bắt đầu thu thập rác và dừng mọi thứ trong khi nó khuấy qua 15G đối tượng đống?

Nếu không jvm làm tổn thương hiệu suất bằng cách không sử dụng tất cả ram sẵn có trên máy.

vm cụ thể của tôi là: Java HotSpot (TM) Máy chủ 64-bit VM (xây dựng 1.6.0_03-b05, chế độ hỗn hợp).

Cảm ơn

+1

Tôi đã giải quyết với -Xms2G -Xmx14G -XX: + UseConcMarkSweepGC hiện tại. –

Trả lời

18

-Xmx15G sẽ đặt kích thước heap tối đa là 15 gig. Java sẽ chỉ phân bổ những gì nó cần khi nó chạy. Nếu bạn không đặt nó, nó sẽ chỉ sử dụng mặc định. Để biết thông tin về mặc định, hãy xem this post.

-Xms15G đặt mức tối thiểu là 15 gig. Điều này buộc java phân bổ 15 gig của không gian heap trước khi nó bắt đầu thực hiện, cho dù nó có cần hay không.

Thông thường bạn có thể đặt cả hai giá trị này thành giá trị thích hợp tùy thuộc vào cách bạn điều chỉnh JVM.

+0

Tôi đã nhận thấy rằng ngay cả khi bạn đặt mức tối thiểu, nó thường sẽ không sử dụng bộ nhớ đó ngay và sẽ thực hiện các GC nhỏ trước khi đạt mức tối thiểu. –

+0

@Peter Quá trình Java sẽ phân bổ nó, nhưng JVM có thể không thực sự sử dụng nó. Tôi không biết về các heuristics của GC, nhưng nó miễn phí để chạy bất cứ khi nào có các đối tượng để thu thập. Hãy xem xét khi Xms == Xmx, tôi mong đợi việc sử dụng đống sẽ không bao giờ khá đáp ứng Xms. Xms là bao nhiêu Java 'mallocs' từ hệ điều hành, không có gì để làm với cách ứng dụng đang chạy trong JVM sử dụng heap. – Cogsy

+0

Có một điều nữa cần thêm nếu bạn đang sử dụng chuỗi -XX: + UseConMarkSweepGC sẽ thực sự giúp tăng tốc độ thu thập trên máy đa lõi nếu có đủ tài nguyên. Ngoài ra, dây có thể thực sự ăn bộ nhớ vì chúng có thể được quảng bá cho thế hệ cũ một cách nhanh chóng. –

0

Nếu bạn không đặt một kích thước heap tối đa (với -Xmx), không phải là tối đa mặc định chỉ 64MB?

Ứng dụng của bạn sẽ không thành công với OutOfMemoryError nếu bạn không đặt? Tôi đang bối rối về câu hỏi này. Ứng dụng của bạn có thể chạy như thế nào mà không cần chuyển đổi này?

+0

Tôi đã chạy với -Xmx 15G và nó chạy tốt. Tôi chỉ tự hỏi nếu có một hit hiệu suất bằng cách nói với jvm nó có 15G để chơi với. Nó sẽ vui vẻ điền vào 15G và sau đó đi mãi mãi curning qua nó. Ngoài ra tôi không chắc chắn bao nhiêu mem ứng dụng sử dụng vì nó phát triển đến 15G khi tôi có -Xmx 15G. –

+0

Bạn có chắc chắn rằng bạn thực sự cần một kích thước 15GB sau đó, và rằng nó không chỉ là một rò rỉ bộ nhớ điên rồ điên rồ? –

+0

Cảm ơn bạn đã trả lời. Nó không thực sự là một vấn đề bộ nhớ tôi đang nghĩ đến, đó là một vấn đề hiệu suất. Tôi không nhận được OutOfMemoryError. Tôi đang cố gắng tìm hiểu xem tôi có nên để nó vào jvm để tìm ra chiến lược bộ nhớ tốt nhất hay tôi nên giúp nó một chút. –

12

Trong Java 6, kích thước heap tối đa mặc định được xác định bởi lượng bộ nhớ hệ thống hiện tại.

Theo trang Garbage Collector Ergonomics, kích thước heap tối đa là:

nhỏ hơn 1/4 của bộ nhớ vật lý hoặc 1GB. Trước J2SE 5.0, kích thước heap tối đa mặc định là là 64MB.

Bằng cách sử dụng công tắc -Xmx có thể được sử dụng để thay đổi kích thước heap tối đa. Xem tài liệu java - the Java application launcher để biết chi tiết sử dụng.

+2

Lưu ý rằng ở trên chỉ đúng đối với các máy "loại máy chủ". Đối với Java SE 6, đây là một máy có ít nhất 2 CPU và ít nhất 2GB bộ nhớ vật lý (theo http://download.oracle.com/javase/6/docs/technotes/guides/vm/server-class.html) –

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