2009-06-25 30 views
63

Với hai lệnh dưới đâyTốc độ cân bằng của các tùy chọn -Xms và -Xmx Java

A:

$ java -Xms10G -Xmx10G myjavacode input.txt 

B:

$ java -Xms5G -Xmx5G myjavacode input.txt 

Tôi có hai câu hỏi:

  1. Vì lệnh A có nhiều bộ nhớ hơn với các tham số của nó, A sẽ chạy nhanh hơn B?
  2. Làm cách nào để -Xmx-Xms ảnh hưởng đến quá trình chạy và đầu ra của chương trình của tôi?
+0

Câu hỏi của bạn có liên quan đến một số vấn đề thực tế hay đó chỉ là câu hỏi lý thuyết? Vì nếu bạn có nhiều RAM trong hệ thống 64 bit, bạn có thể xem xét thay đổi thuật toán của mình để tận dụng lợi thế của nó - ví dụ: đọc/ánh xạ toàn bộ input.txt lớn vào bộ nhớ và thực hiện các thao tác trên đó. – akarnokd

+27

Câu trả lời cho các loại câu hỏi này luôn là "Đo điểm chuẩn và tìm hiểu". –

+4

Tôi hỏi người bảo trì gói JVM và anh ấy nói: "Trên Linux, tôi không chắc chắn rằng -Xms làm được rất nhiều trừ khi bạn có một thiết lập lạ. Có lẽ nó phân bổ mà không có MAP_NORESERVE chỉ để đảm bảo RAM thực sự ở đó. nó. " –

Trả lời

20

Phụ thuộc vào GC mà java của bạn đang sử dụng. Các GC song song có thể hoạt động tốt hơn trên các thiết lập bộ nhớ lớn hơn - tôi không có chuyên gia về điều đó.

Nói chung, nếu bạn có bộ nhớ lớn hơn, ít thường xuyên hơn nó cần phải được GC-ed - có rất nhiều chỗ cho rác. Tuy nhiên, khi nói đến một GC, GC phải làm việc trên bộ nhớ nhiều hơn - mà lần lượt có thể chậm hơn.

+0

@ kd304: Vì vậy, nếu CPU của tôi có RAM lớn (nói 10GB) và giả sử điều đó là đủ để ứng dụng của tôi chạy. Bạn có nghĩa là bộ nhớ ít hơn như trong Xmx/Xms param chúng tôi sử dụng nhanh hơn mã của tôi sẽ chạy? – neversaint

+0

@ kd304: btw, làm thế nào tôi có thể kiểm tra GC của java tôi đang sử dụng? – neversaint

+45

CPU không có ram. – jjnguy

1

Rất khó để nói cách phân bổ bộ nhớ sẽ ảnh hưởng đến tốc độ của bạn. Nó phụ thuộc vào thuật toán thu gom rác mà JVM đang sử dụng. Ví dụ, nếu người thu gom rác của bạn cần tạm dừng để thực hiện một bộ sưu tập đầy đủ, thì nếu bạn có thêm 10 bộ nhớ hơn bạn thực sự cần thì người thu gom sẽ có thêm 10 rác để dọn dẹp.

Nếu bạn đang sử dụng java 6, bạn có thể sử dụng jconsole (trong thư mục bin của jdk) để đính kèm vào quá trình của bạn và xem cách trình thu thập hoạt động. Nói chung các nhà sưu tập rất thông minh và bạn sẽ không cần phải thực hiện bất kỳ điều chỉnh nào, nhưng nếu bạn có nhu cầu, có rất nhiều tùy chọn mà bạn đã sử dụng để điều chỉnh quá trình thu thập.

163

Đối số -Xmx xác định kích thước bộ nhớ tối đa mà heap có thể tiếp cận cho JVM. Bạn phải biết chương trình của bạn tốt và xem nó hoạt động như thế nào dưới tải và thiết lập thông số này cho phù hợp. Giá trị thấp có thể gây ra OutOfMemoryExceptions hoặc hiệu suất rất kém nếu bộ nhớ heap của chương trình đạt đến kích thước heap tối đa. Nếu chương trình của bạn đang chạy trong máy chủ chuyên dụng, bạn có thể đặt tham số này cao hơn vì nó sẽ không ảnh hưởng đến các chương trình khác.

Đối số -Xms đặt kích thước bộ nhớ heap ban đầu cho JVM. Điều này có nghĩa là khi bạn bắt đầu chương trình của bạn, JVM sẽ cấp phát lượng bộ nhớ này ngay lập tức. Điều này rất hữu ích nếu chương trình của bạn sẽ tiêu tốn một lượng lớn bộ nhớ heap ngay từ đầu. Điều này tránh JVM liên tục tăng heap và có thể đạt được một số hiệu suất ở đó. Nếu bạn không biết thông số này có giúp ích cho bạn hay không, thì không sử dụng thông số.

Tóm lại, đây là một sự thỏa hiệp mà bạn phải quyết định chỉ dựa trên hành vi bộ nhớ của chương trình của bạn.

+0

bạn nói 'Nếu chương trình của bạn đang chạy trong máy chủ chuyên dụng, bạn có thể thiết lập tham số này cao hơn vì nó sẽ không ảnh hưởng đến các chương trình khác. Tôi tin rằng nếu chúng ta có nhiều tiến trình đang chạy trên cùng một nút và quá trình khác như với Xmx, bộ nhớ đã được dành riêng cho mỗi quá trình (mà không thể được sử dụng bởi bất kỳ quá trình nào khác) Phải không? – emilly

+0

Bạn có thể cung cấp suy nghĩ của mình trên http://stackoverflow.com/questions/39652282/impact-of-heap-parameters-on-gc-performance và http://stackoverflow.com/questions/39652282/impact-of-heap -parameters-on-gc-performance? Cảm ơn trước – emilly

2
  1. Phân bổ luôn phụ thuộc vào hệ điều hành của bạn. Nếu bạn phân bổ quá nhiều bộ nhớ, bạn có thể kết thúc việc tải các phần vào trao đổi, thực sự là chậm.
  2. Cho dù chương trình của bạn chạy chậm hơn hay nhanh hơn phụ thuộc vào các tham chiếu mà VM phải xử lý và làm sạch. GC không phải quét qua bộ nhớ được cấp phát để tìm các đối tượng bị bỏ rơi. Nó biết các đối tượng của nó và lượng bộ nhớ mà chúng phân bổ bằng ánh xạ tham chiếu. Vì vậy, quét chỉ phụ thuộc vào kích thước của các đối tượng của bạn.Nếu chương trình của bạn hoạt động giống nhau trong cả hai trường hợp, tác động hiệu suất duy nhất sẽ là khi khởi động VM, khi máy ảo cố phân bổ bộ nhớ do hệ điều hành của bạn cung cấp và nếu bạn sử dụng hoán đổi (lại dẫn đến 1.)
3

Tôi thấy rằng trong một số trường hợp, quá nhiều bộ nhớ có thể làm chậm chương trình.

Ví dụ: tôi đã có công cụ chuyển đổi dựa trên nền ngủ đông bắt đầu chạy chậm khi tải tăng lên. Hóa ra là mỗi khi chúng ta có một đối tượng từ db, hibernate đã kiểm tra bộ nhớ cho các đối tượng sẽ không bao giờ được sử dụng nữa.

Giải pháp là loại bỏ các vật cũ khỏi phiên.

Stuart

1
> C:\java -X 

-Xmixed   mixed mode execution (default) 
-Xint    interpreted mode execution only 
-Xbootclasspath:<directories and zip/jar files separated by ;> 
        set search path for bootstrap classes and resources 
-Xbootclasspath/a:<directories and zip/jar files separated by ;> 
        append to end of bootstrap class path 
-Xbootclasspath/p:<directories and zip/jar files separated by ;> 
        prepend in front of bootstrap class path 
-Xnoclassgc  disable class garbage collection 
-Xincgc   enable incremental garbage collection 
-Xloggc:<file> log GC status to a file with time stamps 
-Xbatch   disable background compilation 
-Xms<size>  set initial Java heap size 
-Xmx<size>  set maximum Java heap size 
-Xss<size>  set java thread stack size 
-Xprof   output cpu profiling data 
-Xfuture   enable strictest checks, anticipating future default 
-Xrs    reduce use of OS signals by Java/VM (see documentation) 
-Xcheck:jni  perform additional checks for JNI functions 
-Xshare:off  do not attempt to use shared class data 
-Xshare:auto  use shared class data if possible (default) 
-Xshare:on  require using shared class data, otherwise fail. 

Các -X tùy chọn là phi tiêu chuẩn và có thể thay đổi mà không cần thông báo trước.

(sao chép-dán)

+0

Không trả lời câu hỏi. – neo7

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