Là tham chiếu nhận xét, hãy xem: http://java-performance.info/string-intern-in-java-6-7-8/. Đó là tham khảo rất sâu sắc và tôi đã học được rất nhiều, tuy nhiên tôi không chắc chắn kết luận của nó là nhất thiết "một kích thước phù hợp với tất cả". Mỗi khía cạnh phụ thuộc vào nhu cầu của ứng dụng của riêng bạn - việc thực hiện các phép đo dữ liệu đầu vào thực tế là rất khuyến khích!
Yếu tố chính có thể phụ thuộc vào những gì bạn đang ở trong kiểm soát:
Bạn có toàn quyền kiểm soát lựa chọn GC? Trong một ứng dụng GUI chẳng hạn, vẫn còn một trường hợp mạnh mẽ được thực hiện để sử dụng Serial GC. (tổng dung lượng bộ nhớ thấp hơn rất nhiều cho quá trình này - hãy suy nghĩ 400 MB so với 1 GB cho một ứng dụng phức tạp vừa phải, và sẵn sàng hơn nhiều bộ nhớ phát hành, ví dụ: sau khi tăng đột biến về mức sử dụng). Vì vậy, bạn có thể chọn điều đó hoặc cung cấp cho người dùng của bạn tùy chọn. (Nếu heap vẫn nhỏ thì việc tạm dừng không nên là một vấn đề lớn).
Bạn có toàn quyền kiểm soát mã không?Tùy chọn G1GC thật tuyệt vời cho các thư viện của bên thứ ba (và các ứng dụng!) Mà bạn không thể chỉnh sửa.
Việc xem xét thứ hai (theo @ câu trả lời Zhongyu của) là String.intern
có thể de-duplication các String
đối tượng bản thân, trong khi G1GC nhất thiết chỉ có thể loại bỏ trùng lặp tin char[]
lĩnh vực của họ.
Cân nhắc thứ ba có thể là mức sử dụng CPU, giả sử nếu tác động đến tuổi thọ pin của máy tính xách tay có thể là mối quan tâm đối với người dùng của bạn. G1GC sẽ chạy một chuỗi bổ sung dành riêng cho việc sao chép vùng heap. Ví dụ, tôi chơi với điều này để chạy Eclipse và tìm thấy nó gây ra một giai đoạn ban đầu của hoạt động CPU tăng lên sau khi bắt đầu (suy nghĩ 1 - 2 phút) nhưng nó được giải quyết trên một heap nhỏ hơn "trong sử dụng" và không rõ ràng (chỉ là mắt- balling người quản lý tác vụ) CPU trên cao hoặc chậm xuống sau đó. Vì vậy, tôi tưởng tượng một% nào đó của một lõi CPU sẽ được đưa lên trên de-sao chép (trong? Sau?) Các giai đoạn của bộ nhớ cao-khuấy. (Tất nhiên có thể có một khoản phí tương đương nếu bạn gọi String.intern ở mọi nơi, cũng sẽ chạy theo sau, nhưng sau đó ...)
Có thể bạn không cần chuỗi trùng lặp ở mọi nơi. Có lẽ khu vực nhất định của mã rằng:
- thực sự ảnh hưởng đến việc sử dụng đống dài hạn, và
- tạo ra một tỷ lệ cao của chuỗi trùng lặp
Bằng cách sử dụng String.intern
chọn lọc, các bộ phận khác của mã (có thể tạo ra các chuỗi tạm thời hoặc bán tạm thời) không trả giá.
Và cuối cùng, một plug nhanh chóng cho các tiện ích Ổi: Interner, trong đó:
Cung cấp hành vi tương đương với String.intern()
cho loại không thay đổi khác
Bạn cũng có thể sử dụng cho Strings. Bộ nhớ có lẽ là (và nên là) mối quan tâm hiệu suất hàng đầu của bạn, vì vậy điều này có thể không áp dụng thường xuyên: tuy nhiên khi bạn cần phải giảm từng giọt tốc độ ra khỏi một số khu vực nóng, kinh nghiệm của tôi là tham chiếu yếu dựa trên Java Các giải pháp HashMap chạy hơi nhưng nhanh hơn so với triển khai C++ của JVM là String.intern()
, ngay cả sau khi điều chỉnh các tùy chọn jvm. (Và tiền thưởng: bạn không cần phải điều chỉnh các tùy chọn JVM để mở rộng cho đầu vào khác nhau.)
Nguồn
2017-06-15 12:28:02
[Video được đề xuất] (https://www.youtube.com/watch?v=YgGAUGC9ksk) - nhưng dù sao đi nữa, kết luận luôn giống nhau: Bạn. Nên. Không phải. Quan tâm. – fge
xin lỗi, không nên quan tâm đến điều gì? về cái nào để sử dụng (có nghĩa là chúng tương đương) hoặc về tính năng mới (có nghĩa là nó không hữu ích) ?? – Hilikus
Có nghĩa là: chỉ cần sử dụng lớp 'String' mà không có suy nghĩ thứ hai. – fge