2012-06-21 19 views
14

Trên trang này blog post, người ta nói rằng việc sử dụng bộ nhớ tối thiểu của một Chuỗi là:Tại sao sử dụng bộ nhớ String của Java lại cao?

8 * (int) ((((no chars) * 2) + 45)/8) bytes.

Vì vậy, đối với chuỗi "Máy tính Apple", mức sử dụng bộ nhớ tối thiểu sẽ là 72 byte.
Thậm chí nếu tôi có 10.000 đối tượng chuỗi có chiều dài gấp đôi, việc sử dụng bộ nhớ sẽ nhỏ hơn 2Mb, điều này hoàn toàn không nhiều. Vậy điều đó có nghĩa là tôi đang đánh giá thấp số lượng Strings hiện diện trong một ứng dụng doanh nghiệp, hay là công thức sai?

Cảm ơn

Trả lời

16

Bộ lưu trữ chuỗi trong Java phụ thuộc vào cách thu được chuỗi. Sự ủng hộ char mảng có thể được chia sẻ giữa nhiều trường hợp. Nếu đó không phải là trường hợp, bạn có đối tượng thông thường trên cao cộng với lưu trữ cho một con trỏ và ba int s mà thường đi ra đến 16 byte trên không. Sau đó mảng sao lưu yêu cầu 2 byte cho mỗi char từ char s là các đơn vị mã UTF-16.

Đối "Apple Computers" nơi mảng ủng hộ không được chia sẻ, chi phí tối thiểu sẽ là

  1. ủng hộ mảng cho 16 ký tự - 32B mà gắn độc đáo trên một ranh giới từ.
  2. con trỏ đến mảng - 4 hoặc 8B tùy thuộc vào nền tảng này
  3. ba int s cho bù đắp, chiều dài, và hashcode memoized - 12B
  4. 2 x đối tượng overhead - phụ thuộc vào VM, nhưng 8B là một quy luật tốt của ngón tay cái.
  5. một int cho chiều dài mảng.

Vì vậy, khoảng 72B trong đó trọng tải thực tế chiếm 44,4%. Tải trọng tạo thành nhiều hơn cho các chuỗi dài hơn.


Trong Java7, một số hiện thực JDK là doing away with backing array sharing để tránh ghim lớn char [] s trong bộ nhớ. Điều đó cho phép họ loại bỏ 2 trong số ba số int s.

Điều đó thay đổi phép tính thành 64B cho chuỗi có độ dài 16 trong đó trọng tải thực tế chiếm 50%.

1

So với các loại dữ liệu khác bạn có, chắc chắn là cao. Các nguyên thủy khác sử dụng 32 bit, 64 bit, v.v.

Và cho rằng String là không thay đổi, mỗi lần bạn thực hiện bất kỳ thao tác nào, bạn sẽ tạo đối tượng String mới, tiêu thụ nhiều bộ nhớ hơn.

+1

Vì Chuỗi là bất biến, các thao tác bạn thực hiện trên thực tế có thể * lưu * không gian, vì các chuỗi có thể chia sẻ bộ nhớ. – Thilo

+0

Nhưng mỗi khi bạn tạo một đối tượng 'String' mới, nó sẽ không chiếm nhiều bộ nhớ hơn? –

+0

Nguyên thủy sử dụng 32 byte? Tôi nghĩ bạn có nghĩa là bit. :) – Makoto

3

Có thể lưu dữ liệu ký tự bằng bộ nhớ ít hơn một chuỗi Java không? Vâng.

Ứng dụng này có quan trọng đối với các ứng dụng "doanh nghiệp" (hoặc thậm chí là các ứng dụng Android hoặc J2ME, mà phải có ít bộ nhớ hơn)? Hầu như không bao giờ.

Tối ưu hóa sớm là gốc ...

+1

+1 để tối ưu hóa sớm. – Makoto

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