2014-09-30 26 views
7

Tôi đã lược tả phiên bản x64 của ứng dụng khi mức sử dụng bộ nhớ quá cao, tất cả dường như đến từ JavaFX MediaPlayer, tôi phát hành chính xác người nghe và eventhandlers.Java - Mức tiêu thụ bộ nhớ dư giữa x32 và x64

Dưới đây là sự tương phản hoàn toàn.

Phiên bản x32 lúc khởi

enter image description here

Và bây giờ phiên bản x64 lúc khởi

enter image description here

Phiên bản x32 vẫn dưới 256MB trong khi x64 sẽ bắn trong một buổi biểu diễn; đây là trong khi cả hai đều được để chơi thông qua danh sách phát của họ.

Tất cả mã đều giống nhau.

JDK: jdk1.8.0_20

JRE: jre1.8.0_20

đối số VM trên cả

-XX:MinHeapFreeRatio=40 -XX:MaxHeapFreeRatio=70 -Xms3670k -Xmx256m -Dsun.java2d.noddraw=true -XX:+UseParallelGC 

Cùng một vấn đề xảy ra trên một ứng dụng x64 Java

enter image description here

Đây có phải là lỗi hoặc tôi đang xem một số Điều?

Trả lời

3

Điều bạn đang thấy là việc sử dụng bộ nhớ của toàn bộ JVM đang chạy quy trình của bạn. Cài đặt -Xmx256m chỉ giới hạn khoảng trống tối đa có sẵn cho ứng dụng của bạn để phân bổ (và JVM sẽ thực thi điều đó). Bên ngoài không gian heap, JVM có thể sử dụng bộ nhớ bổ sung cho một loạt các mục đích khác (tôi chắc chắn tôi sẽ bỏ lỡ một vài trong danh sách dưới đây):

  • PermGen, mà bây giờ đã được thay thế bằng Metaspace. Theo documentation, không có giới hạn mặc định cho việc này:.

    -XX:MaxMetaspaceSize=size 
    Sets the maximum amount of native memory that can be allocated for class metadata. By default, the size is not limited. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system. 
    
  • gian Stack (bộ nhớ sử dụng = (số đề) * ngăn xếp kích thước Bạn có thể kiểm soát này với tham số -Xss

  • off-đống không gian (hoặc sử dụng ByteBuffers trong mã của bạn, hoặc sử dụng các thư viện viên hoặc thứ ba như EHCache mà sẽ được sử dụng lần lượt off-nhớ heap)

  • JNI đang

  • GC (thu gom rác cần bộ nhớ riêng của họ, đó là một lần nữa không nằm trong đống và có thể thay đổi rất nhiều tùy thuộc vào các nhà sưu tập sử dụng và việc sử dụng bộ nhớ ứng dụng)

Trong trường hợp của bạn, bạn đang nhìn thấy sự "gần như tăng gấp đôi "sử dụng bộ nhớ, cộng thêm có thể là sự phân bổ Metaspace thư giãn hơn khi bạn di chuyển từ một 32 bit đến một JVM 64 bit. Sử dụng -XX:MaxMetaspaceSize=128m có thể sẽ làm giảm mức sử dụng bộ nhớ xuống dưới 512MB cho JVM 64 bit.

+0

Tôi không biết những thay đổi này và tôi đã thêm thông số vào trình bao bọc ứng dụng và mức sử dụng bộ nhớ của tôi tương tự như ứng dụng x32. Cảm ơn bạn. – user3037561

0

Tôi không biết ứng dụng của bạn, tương ứng với cách ứng dụng được triển khai.

Một lý do có thể cho sự khác biệt đáng kinh ngạc này có thể là số lượng bộ nhớ có thể được sử dụng trước khi thực hiện thu gom rác thải. Có thể nghĩ rằng một máy có từ 64 bit được cấp phát bộ nhớ nhiều hơn thì một máy có từ 32 bit. Bộ thu gom rác có thể chạy ít thường xuyên hơn, vì vậy sẽ có nhiều bộ nhớ rác hơn vẫn được cấp phát, ngay cả khi nó không thực sự cần thiết hoặc hữu ích.

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