2011-11-10 10 views
5

Hiện tại, chúng tôi có một sản phẩm chạy trên phiên bản 1.6 JRE 32 bit. Chúng tôi đang sử dụng Berkeley DB mà tiêu thụ khoảng 2,5 GB RAM của không gian địa chỉ 4 GB. Điều đó khiến chúng ta có khoảng 750 MB bộ nhớ cho không gian địa chỉ JVM.java: Cách sử dụng bộ nhớ vượt quá 4 GB trong 32 bit JVM

Hiện chúng tôi đang gặp sự cố OutOfMemory với thiết lập hiện tại. Nó sẽ là tốt đẹp để tăng kích thước heap JVM của chúng tôi lên 1,5 GB trong khi vẫn giữ lại không gian 2,5 GB Berkeley DB. Có cách nào để truy cập hơn 4 GB RAM/heap trong một JVM 32 bit không? Tôi đã xem xét các giải pháp sau đây
1) sử dụng JVM làm GC tốt hơn - điều này sẽ cho tôi kết quả cận biên - tôi có thể nhận được khoảng 50-100 MB bộ nhớ hoạt động
2) một cái gì đó như memcached hoặc "quá trình ehcache "- điều này có thể giúp tôi nhiều như phần cứng cho phép với phí trên của IPC/serialization.

Có giải pháp nào khác để tăng bộ nhớ địa chỉ của ứng dụng không?

Giải pháp nên hoạt động trên sparc solaris 10 chạy.

* UPDATE: Bởi vì của việc sử dụng các thư viện chia sẻ bản xứ, ngay bây giờ, chúng tôi không thể chuyển sang một JVM 64-bit mặc dù hệ điều hành là 64-bit *

cảm ơn bạn,

+1

Hệ điều hành là 64 bit mặt trời với nhiều RAM GB. Nó chỉ là quá trình java cần nhiều RAM/heap hơn. – anjanb

+0

anjanb, bạn có thể nói phiên bản chính xác của BerkeleyDB không? Làm thế nào rất nhiều bộ nhớ đã được dành riêng cho BerkeleyDB? – osgx

Trả lời

3

Các chương trình 32 bit không có khả năng xử lý nhiều hơn 4GB địa chỉ bộ nhớ. Họ chỉ không có đủ bit để đại diện cho nhiều bộ nhớ hơn.

2^32 = 4 294 967 296

Đặt cược của bạn tốt nhất là nên nâng cấp lên một JRE 64-bit.

+0

Do sử dụng thư viện được chia sẻ gốc, ngay bây giờ, chúng tôi không thể chuyển sang JVM 64 bit mặc dù hệ điều hành là 64 bit – anjanb

+0

@anjanb: Trong trường hợp đó, bạn có thể phải chia ứng dụng thành nhiều quy trình, như osgx khuyến cáo. – StriplingWarrior

5

Có các giải pháp khác để tăng bộ nhớ địa chỉ của ứng dụng không?

  1. Chia ứng dụng đơn lẻ trong nhiều quy trình với bộ nhớ không dùng chung (không phải chủ đề; nhưng quy trình). Quá trình đầu tiên có thể chạy DB và thứ hai có thể chạy một phần khác của dự án. Bạn có thể sử dụng RMI hoặc bộ nhớ hoặc ổ cắm dùng chung để giao tiếp giữa các quá trình.
  2. Bộ nhớ thấp hơn, được dành riêng cho hệ điều hành. Ví dụ. trên x86-32 PAE cho phép hệ điều hành đặt trước một không gian địa chỉ ảo 4GB nhỏ hơn 1 GB. (ví dụ: "phân chia 4GB/4Gb", được hỗ trợ trên Oracle Linux)
  3. Đặt một số dữ liệu vào đĩa. Đĩa có thể là một đĩa RAM để có tốc độ tốt hơn; hoặc nó có thể là đĩa thực và hệ điều hành sẽ tăng tốc độ truy cập vào các tập tin bằng cách sử dụng "bộ nhớ cache trang".

Ngoài ra, mọi SPARC thực sự (không phải là SuperSparc cổ đại hoặc LION kém) thực sự là 64 bit. Vì vậy, có thể dễ dàng chuyển sang phiên bản hệ điều hành 64 bit. Tôi không biết về Solaris, nhưng trong linux có thể chạy các ứng dụng 32-bit trên hệ điều hành 64-bit. Và hệ điều hành 64bit sẽ cho phép bạn chạy JVM 64 bit.

CẬP NHẬT: Có các đĩa RAM trong Solaris http://wikis.sun.com/display/BigAdmin/Talking+about+RAM+disks+in+the+Solaris+OS và tôi nghĩ bạn nên thử chúng để lưu trữ cơ sở dữ liệu (hoặc các tệp tạm thời của DB). Sẽ không có thêm serialization/IPC như trong trường hợp (1); chỉ đọc/ghi thêm hoặc mmap/munmap. Nhưng Ramdisk là thứ tự nhanh hơn SSD và 3-4 đơn đặt hàng nhanh hơn HDD.

+0

Do sử dụng thư viện được chia sẻ gốc, ngay bây giờ, chúng tôi không thể chuyển sang JVM 64 bit mặc dù hệ điều hành là 64-bit – anjanb

+1

Bạn có thể di chuyển lib gốc sang quá trình được tách riêng không? Bạn đã thử chạy JVM 32 bit trên hệ điều hành 64 bit (điều này có thể giúp không yêu cầu chia 2/2 hoặc 3/1 GB)? – osgx

+0

Có một thử nghiệm nhanh để kiểm tra lược đồ tách bộ nhớ: http://stackoverflow.com/questions/987219/max-amount-of-memory-per-java-process-in-windows/987576#987576 - bạn có thể chạy nó trong môi trường hiện tại của bạn và trong 64-bitOS + 32bit JVM kết hợp – osgx

3

Tôi khuyên bạn nên chạy các thư viện gốc được chia sẻ 32 bit của mình trong một JVM 32 bit và chạy mọi thứ khác trong JVM 64 bit. Bạn có thể có JVM 64 bit gọi cho JVM 32 bit để làm bất cứ điều gì. Tôi cho rằng phần lớn yêu cầu dữ liệu/bộ nhớ của bạn có thể được chuyển sang JVM 64 bit.

+0

đó là điều chúng tôi sẽ phải thử nghiệm và xem liệu nó có hợp lý không thông lượng dự kiến ​​của hệ thống. – anjanb

+0

Bạn sẽ có thể đạt được thông lượng từ 500 MB/s đến 3000 MB/s giữa hai quy trình trên cùng một máy (tùy thuộc vào phần cứng của bạn). –

+0

bạn có thể đề xuất phương pháp tốt nhất cho ứng dụng Java 64 bit để nói chuyện với ứng dụng java 32 bit. Tôi nhận thức được các cơ chế IPC unix/linux thông thường nhưng cơ chế nào trong số này hoạt động tốt nhất trong kịch bản java 64 bit và bitcoin 32 bit? – anjanb