Hỏi nhảm về stringPool trong ngôn ngữ java

Chào mọi người, sau vài ngày tìm hiểu về java tui có đọc được string trong java là Immutable (bất hoại , vĩnh sinh bất biến …). Tui có test thử code như ở dưới đây, thì quả thật nó bất biến như hằng số thiệt.

package OOP;
public class testOOP{
    public static void main(String[] args){
        String str = "DayNhauHoc.com";
        System.out.println( "Lower case: " + str.toLowerCase() );
        System.out.println( "After: " + str );
    }
}

Output:
image

Tui tìm hiểu tiếp trên google thì gặp đoạn này:

Khi bạn khởi tạo một biến String với chuỗi nằm trong dấu ngoặc kép ” ” (ví dụ: String s = “heloo”) tức là bạn đang khởi tạo một đối tượng String Literal và đối tượng String này được cất giữ ở trong một vùng nhớ đặc biệt gọi là String Pool. Mỗi khi bạn khởi tạo một String Literal tiếp theo, JVM sẽ kiểm tra String Pool; nếu chuỗi đã tồn tại trong Pool, một tham chiếu tới String Literal tương ứng được trả về, nếu không JVM sẽ khởi tạo một đối tượng String mới và đặt nó vào trong Pool. String Literal khiến việc quản lí bộ nhớ của JVM được hiệu quả hơn

Tui có test thử thì đúng là vậy thật :

package OOP;
public class testOOP{
    public static void main(String[] args) {
        String str1 = "DayNhauHoc.com";
        String str2 = "DayNhauHoc.com";
        String str3 = new String("DayNhauHoc.com");
        System.out.println(str1 == str2);
        System.out.println(str1 == str3);   
    }
}

Output:

Tui suy nghĩ mãi trong đầu là, mặc dù là để quản lý tốt bộ nhớ (có thể), nhưng nếu StringPool có nhiều string thì sao (cở hàng triệu hàng tỉ cái string), Không biết việc tìm kiếm xem có sẵn chưa có tốn nhiều thời gian hay không? Nếu không thì không biết cách StringPool nó tổ chức các string sẵn có đó như nào?

Cái này thì khá là khó để đạt được nha. Đâu có dev nào rỗi đến mức ngồi gõ số lượng lớn như vậy. Mà nếu có thì khả năng gặp tình trạng Java Heap Space là rất cao.

Theo em biết thì việc tạo bằng new sẽ nhanh hơn tuy nhiên thì giữa việc tốn thời gian với việc tràn bộ nhớ rồi bay màu thì anh sẽ chọn bên nào. Em thì chắc chắn là tốn thời gian.
Cái gì tạo ra cũng có ý nghĩa của nó. Ví dụ đơn giản như Java so với C/C++ thì hiệu suất thấp hơn nhưng được hỗ trợ nhiều thư viện hơn(thấy nói thế) chẳng hạn.

2 Likes

Literal string được lưu trong StringTable, nó giống như hashmap vậy, cơ chế tìm kiếm, tổ chức lưu trữ(buckets) cũng y chang nên tiếm kiếm là O(1) nên không sao. Có điều nó ko rehash được.


Vậy trong trường hợp lưu nhiều bạn cần tăng StringTable size lên lúc start Java App.
Default bucket của StringTable là 60013,
để biêt defaul hiện tại cúa StringTable chạy với jvm option:

 -XX:+PrintStringTableStatistics

để tăng

 -XX:StringTableSize=200000

Đọc thêm:
https://programmer.help/blogs/jvm-memory-structure-method-area.html

10 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?