2009-03-25 44 views
7

Tôi đang cố triển khai bộ sưu tập các đối tượng giống như bộ nhớ cache. Mục đích là để có thể truy cập nhanh đến các đối tượng này thông qua địa phương trong bộ nhớ vì tôi có thể sẽ đọc nhiều đối tượng cùng một lúc. Tôi hiện đang lưu trữ các đối tượng trong một đối tượng bộ sưu tập java như vector hoặc deque. Nhưng tôi không tin rằng điều này làm cho việc sử dụng bộ nhớ tiếp giáp.cố gắng lưu trữ các đối tượng java trong bộ nhớ liền kề

Tôi biết điều này có thể được thực hiện trong C, nhưng nó có thể được thực hiện trong Java không? Các đối tượng này có thể có độ dài khác nhau (vì chúng có thể chứa các chuỗi). Có cách nào để phân bổ bộ nhớ tiếp giáp thông qua Java? Có một đối tượng bộ sưu tập Java nào không?

Vui lòng cho tôi biết.

Xin cảm ơn, jbu

+2

Điều gì sẽ lưu trữ nó trong bộ nhớ tiếp giáp giúp bạn? –

+2

tra cứu nhanh hơn, ít lỗi trang hơn – jbu

+0

Điều này có được hiển thị qua hồ sơ không? –

Trả lời

14

Bạn không thể ép buộc. Nếu bạn phân bổ tất cả các đối tượng liên tiếp nhanh, chúng có thể là để tiếp giáp - nhưng nếu bạn lưu trữ chúng trong bộ sưu tập, sẽ không đảm bảo rằng bộ sưu tập sẽ là cục bộ cho các giá trị thực. (Bộ sưu tập sẽ có tham chiếu đến các đối tượng, thay vì tự chứa các đối tượng.)

Ngoài ra, nén GC sẽ di chuyển các giá trị xung quanh trong bộ nhớ.

Bạn đã thực sự lược tả ứng dụng của mình và thấy đây là một nút cổ chai? Trong hầu hết các trường hợp, tôi mong đợi các tối ưu hóa khác có thể giúp bạn một cách đáng tin cậy hơn.

+1

vâng, hãy lập hồ sơ trước tiên, vì vậy bạn không lãng phí thời gian sửa chữa những gì không bị hỏng. –

+0

Tôi sẽ làm điều đó.Nếu đây thực sự là một nút cổ chai cho ứng dụng của bạn, có thể bạn đang viết nó bằng ngôn ngữ không đúng. –

4

Bạn đã viết mã này chưa bằng Java chưa? Và nếu có, bạn đã lược tả nó chưa? Tôi cho rằng bạn có thể không cần phải lo lắng về các đối tượng đang ở trong bộ nhớ tiếp giáp - JVM là tốt hơn trong quản lý bộ nhớ hơn là bạn đang ở trong một môi trường thu gom rác thải.

Nếu bạn thực sự lo ngại về hiệu suất, có thể Java không phải là công cụ thích hợp cho công việc, nhưng bản năng ruột của tôi là cho bạn biết rằng bạn đang lo lắng về việc tối ưu hóa quá sớm và phiên bản Java của bạn mã, làm việc với bộ nhớ không tiếp giáp, có thể sẽ phù hợp với nhu cầu của bạn.

+0

bạn nói đúng, tối ưu hóa nên đến sau khi triển khai và lược tả chính xác. Tôi chỉ đang cố nghĩ về phía trước. Mặc dù nó vẫn là một bài học trong lý thuyết java. – jbu

8

Không, bạn không thể đảm bảo địa phương này tham chiếu.

Bằng cách phân bổ mảng byte hoặc sử dụng bộ đệm byte được ánh xạ từ gói nio, bạn có thể nhận được một đoạn bộ nhớ liền kề, từ đó bạn có thể giải mã dữ liệu bạn muốn (thực hiện deserializing các đối tượng quan tâm từ đoạn này ký ức). Tuy nhiên, nếu bạn liên tục truy cập vào cùng một đối tượng, thì chi phí trên deserialization có thể sẽ đánh bại mục đích.

+0

do đó, nó giống như âm thanh của các nguyên thủy có thể được lưu trữ trong bộ nhớ liền kề nhưng không phải là một mảng các đối tượng. đúng không? – jbu

+1

Mảng tiếp giáp - nhưng nếu bạn có một mảng như Foo [] có nghĩa là một mảng các tham chiếu Foo * *, không phải các đối tượng Foo * *. Java không có kiểu giá trị do người dùng xác định. –

-1

Tôi đề xuất sử dụng HashMap (không có luồng) hoặc Hashtable (luồng) cho bộ nhớ cache của bạn. Cả hai lưu trữ một đối tượng vào một mảng trong jvm mặt trời. Vì tất cả các đối tượng trong java được truyền qua tham chiếu, nên nó được biểu diễn như một mảng con trỏ trong c. Đặt cược của tôi là bạn đang thực hiện tối ưu hóa sớm.

Nếu bạn hoàn toàn phải có điều này, bạn có hai tùy chọn:

1) Sử dụng JNI và viết nó vào c. 2) Nhận bộ đệm byte BIG và sử dụng ObjectOutputStream để ghi các đối tượng vào nó. Điều này có thể xảy ra được VERY SLOW so với việc sử dụng một bảng băm.

+1

Đối tượng không được chuyển qua tham chiếu. Các tham chiếu (và tất cả các đối số khác) đều được truyền theo giá trị. Có một sự khác biệt lớn, và nó có giá trị chính xác.

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