2009-07-08 28 views
59

Sau khi đọc đã hỏi câu hỏi về chủ đề và rất nhiều googling Tôi vẫn không thể có một cái nhìn rõ ràng về -Xms tùy chọnthông số đống JVM

Câu hỏi của tôi là: sự khác biệt giữa java -Xms=512m -Xmx=512mjava -Xms=64m -Xmx=512m là những gì ?

Để bây giờ tôi có câu trả lời sau đây:

Sự khác biệt duy nhất là trong số các bộ sưu tập rác sẽ được chạy trong thời gian chạy ứng dụng của tôi và số lượng phân bổ bộ nhớ. Tôi có đúng không?

Dưới đây là lý do của tôi cho câu trả lời này:

Đặt tùy chọn này -Xms để 512m không dẫn đến ứng dụng của tôi sử dụng thực sự 512M bộ nhớ vật lý sau khi khởi động. Tôi đoán điều này liên quan đến việc quản lý bộ nhớ ảo hệ điều hành hiện đại và phân bổ các trang lười biếng. (Tôi nhận thấy rằng việc thiết -Xms để 512M hoặc 64M không thay đổi ở tất cả các bộ nhớ được sử dụng ban đầu báo cáo bằng cách đầu trên Linux hoặc bởi công việc quản lý trên cửa sổ)

Ai đó có thể giúp tôi hiểu tác động của Xms này tùy chọn hoặc chỉ cho tôi các liên kết sẽ giúp tôi hiểu nó?

Cảm ơn trước

Manu

Trả lời

31

Để tóm tắt thông tin được tìm thấy sau liên kết: JVM phân bổ số tiền được chỉ định bởi -Xms nhưng hệ điều hành thường không phân bổ các trang thực cho đến khi cần. Vì vậy, JVM phân bổ bộ nhớ ảo như được chỉ định bởi Xms nhưng chỉ phân bổ bộ nhớ vật lý như là cần thiết.

Bạn có thể thấy điều này bằng cách sử dụng Process Explorer bởi Sysinternals thay vì trình quản lý tác vụ trên cửa sổ.

Vì vậy, có sự khác biệt thực sự giữa việc sử dụng -Xms64M và -Xms512M. Nhưng tôi nghĩ rằng sự khác biệt quan trọng nhất là một trong những bạn đã chỉ ra: các bộ thu rác sẽ chạy thường xuyên hơn nếu bạn thực sự cần 512MB nhưng chỉ bắt đầu với 64MB.

+12

Tôi nghĩ cú pháp thực là -Xms64m và không phải -Xms = 64m. Nếu tôi nhầm, hãy quay lại! – Burkhard

+1

Đến đây khi nghiên cứu một số điểm tốt hơn của cấu hình jvm. Câu trả lời được chấp nhận ở đây rất khác với sự hiểu biết của tôi về những giá trị này. Có, hầu hết các hệ điều hành sẽ chỉ làm cho các trang vật lý có sẵn khi một lỗi trang nhỏ bị vấp khi ứng dụng cố gắng truy cập vào bộ nhớ nó có malloc'ed - nhưng Xms chỉ định số lượng ban đầu của bộ nhớ malloced bởi jvm - mà đặt một ràng buộc trên trên số trang có thể được gán * mà không * ứng dụng malloc'ing nhiều bộ nhớ hơn - và trong trường hợp của Java, nó chỉ có nhiều bộ nhớ hơn (lên đến Xmx) nếu không đủ bộ nhớ có sẵn bằng gc – symcbean

+0

@symcbean Tôi đang bối rối . Có vẻ như sự hiểu biết của bạn không thực sự khác với những gì có trong câu trả lời. Bạn chỉ sử dụng các từ khác nhau, nhưng đang mô tả hành vi giống hệt nhau. – Turismo

4

nếu bạn đã viết: -Xms512m -Xmx512m khi nó bắt đầu, java phân bổ trong những 512M khoảnh khắc của ram cho quá trình của mình và tăng không thể.

-Xms64m -Xmx512m khi bắt đầu, java chỉ phân bổ 64 triệu ram cho quá trình của mình, nhưng java có thể tăng thêm dung lượng bộ nhớ của mình trong khi 512m.

Tôi nghĩ rằng điều thứ hai là tốt hơn bởi vì bạn cung cấp cho java việc quản lý bộ nhớ tự động.

+0

Tôi biết điều đó. Nhưng những gì "Java phân bổ trong những thời điểm 512m" chính xác có nghĩa là gì? Bộ nhớ này dường như không được phân bổ hiệu quả vì hệ thống 512m byte của tôi có thể khởi chạy một số ứng dụng khác mà không cần phải quay và sửa lại cho tôi rằng chỉ có vài megabyte được ứng dụng java của tôi sử dụng .. –

+1

Tại sao điều này lại bị giảm? Đó là kỹ thuật chính xác, ngoại trừ câu cuối cùng có thể hoặc có thể không chính xác. Trong một thế giới hiệu năng cao, thông thường sẽ có java phân bổ tất cả bộ nhớ nó sẽ cần với một brk(). Trong các tình huống khác, việc cấp phát bộ nhớ khi bạn sử dụng nó có thể thông minh hơn. – Fredrik

+0

Tôi không tự mình downvoted câu trả lời này. Về bình luận của bạn tôi có cùng một câu hỏi so với câu hỏi tôi yêu cầu: Có bất kỳ "rủi ro" hoặc hạn chế nào để đặt giá trị Xms thành cùng một giá trị hơn Xmx không? Cảm ơn Manu –

34

JVM sẽ bắt đầu với mức sử dụng bộ nhớ ở cấp độ ban đầu. Nếu maxheap cao hơn, nó sẽ tăng lên đến kích thước tối đa khi yêu cầu bộ nhớ vượt quá bộ nhớ hiện tại của nó.

Vì vậy,

  • -Xms512m -Xmx512m

JVM bắt đầu với 512 M, không bao giờ thay đổi kích thước.

  • -Xms64m -Xmx512m

JVM bắt đầu với 64M, phát triển (lên đến tối đa trần 512) nếu mem. Các yêu cầu vượt quá 64.

+0

Tôi biết điều đó. Nhưng như đã nói trong bình luận trước đây của tôi những gì "Java sẽ bắt đầu với việc sử dụng bộ nhớ ở cấp độ heap ban đầu" chính xác có nghĩa là gì?Bộ nhớ này dường như không được cấp phát hiệu quả vì hệ thống 512m byte của tôi có thể khởi chạy một số ứng dụng khác mà không cần phải quay lại và bảo vệ tôi rằng chỉ có vài megabyte được ứng dụng java của tôi sử dụng. –

+3

Thông thường, bạn sẽ đặt kích thước heap ban đầu thành một giá trị lớn hơn nếu bạn biết rằng một ứng dụng khởi động sẽ tiêu tốn một lượng bộ nhớ cụ thể. Điều này ngăn không cho JVM phải thực hiện thời gian thực thi khi khởi động để thay đổi kích thước vùng heap một số lần. Việc sử dụng cụ thể đó là một sự tối ưu hóa rất phổ biến để làm cho nhật thực chạy nhanh hơn bằng cách tránh chu kỳ phân bổ tốn kém. – dhable

+0

Cảm ơn câu trả lời này đã dẫn tôi đến câu hỏi khác: Có bất kỳ "rủi ro" hoặc hạn chế nào để đặt giá trị Xms thành cùng một giá trị hơn Xmx không? –

5

JVM thay đổi kích thước vùng heap một cách thích ứng, có nghĩa là nó sẽ cố gắng tìm kích thước heap tốt nhất cho ứng dụng của bạn. -Xms và -Xmx chỉ định rõ phạm vi mà JVM có thể hoạt động và thay đổi kích thước vùng heap. Nếu -Xms và -Xmx có cùng giá trị, thì kích thước heap của JVM sẽ giữ nguyên ở giá trị đó.Nó thường tốt nhất để chỉ thiết lập -Xmx và để cho JVM tìm thấy kích thước heap tốt nhất, trừ khi có một lý do cụ thể tại sao bạn cần cung cấp cho JVM một đống lớn khi khởi chạy JVM.

Theo như khi JVM thực sự yêu cầu bộ nhớ từ hệ điều hành, tôi tin rằng nó phụ thuộc vào nền tảng và việc triển khai JVM. Tôi tưởng tượng rằng nó sẽ không yêu cầu bộ nhớ cho đến khi ứng dụng của bạn thực sự cần nó. -Xmx và -Xms chỉ lưu trữ bộ nhớ.

14

Ngoài các thông số Heap chuẩn -Xms-Xmx nó cũng tốt để biết -XX:PermSize-XX:MaxPermSize, được sử dụng để xác định kích thước của không gian Perm Gen bởi vì mặc dù bạn có thể có không gian trong thế hệ khác trong đống bạn có thể chạy ra khỏi bộ nhớ nếu không gian gen perm của bạn được đầy đủ. Liên kết này cũng có tổng quan tốt đẹp về một số important JVM parameters.

0

Tôi tạo ra ví dụ đồ chơi này trong scala, my_file.scala:

object MyObject { 

    def main(args: Array[String]) { 
     var ab = ArrayBuffer.empty[Int] 

     for (i <- 0 to 100 * 1000 * 1000) { 
      ab += i 
      if (i % 10000 == 0) { 
       println("On : %s".format(i)) 
      } 
     } 
    } 
} 

tôi chạy nó với:

scala -J-Xms500m -J-Xmx7g my_file.scala 

scala -J-Xms7g -J-Xmx7g my_file.scala 

Có chắc chắn là tạm dừng đáng chú ý trong phiên bản -Xms500m. Tôi tích cực rằng các tạm dừng ngắn là thu gom rác chạy, và những cái dài là phân bổ đống.

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