Tôi đã đọc rất nhiều bài viết xung đột liên quan đến cấp phát bộ nhớ khi chuỗi được tạo. Một số bài báo nói rằng toán tử mới tạo String trong heap và String literal được tạo trong String Pool [Heap] trong khi một số nói rằng toán tử mới tạo một đối tượng trong heap và một đối tượng khác trong chuỗi String.Tạo chuỗi và mảng mảng Phân bổ bộ nhớ
Để phân tích này tôi đã viết chương trình dưới đây mà in hashcode của String char mảng và đối tượng String:
import java.lang.reflect.Field;
public class StringAnalysis {
private int showInternalCharArrayHashCode(String s)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
final Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
return value.get(s).hashCode();
}
public void printStringAnalysis(String s) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException {
System.out.println(showInternalCharArrayHashCode(s));
System.out.println(System.identityHashCode(s));
}
public static void main(String args[]) throws SecurityException,
IllegalArgumentException, NoSuchFieldException,
IllegalAccessException, InterruptedException {
StringAnalysis sa = new StringAnalysis();
String s1 = new String("myTestString");
String s2 = new String("myTestString");
String s3 = s1.intern();
String s4 = "myTestString";
System.out.println("Analyse s1");
sa.printStringAnalysis(s1);
System.out.println("Analyse s2");
sa.printStringAnalysis(s2);
System.out.println("Analyse s3");
sa.printStringAnalysis(s3);
System.out.println("Analyse s4");
sa.printStringAnalysis(s4);
}
}
này sản lượng bản in chương trình sau đây:
Analyse s1
1569228633
778966024
Analyse s2
1569228633
1021653256
Analyse s3
1569228633
1794515827
Analyse s4
1569228633
1794515827
Từ một đầu ra này điều rất rõ ràng là không phân biệt chuỗi được tạo ra như thế nào, nếu các chuỗi có cùng giá trị thì chúng sẽ chia sẻ cùng một mảng char.
Bây giờ câu hỏi của tôi là chararray này được lưu trữ ở đâu, nó được lưu trữ trong heap hoặc nó đi để permgen? Ngoài ra tôi muốn hiểu làm thế nào để diferentiate giữa các địa chỉ bộ nhớ heap và permgen địa chỉ bộ nhớ.
Tôi có vấn đề lớn nếu nó được lưu trữ trong permgen vì nó sẽ ăn hết không gian hạn chế quý giá của tôi. và nếu mảng char không được lưu trữ trong permgen nhưng trong heap thì nó ngụ ý rằng String literals cũng sử dụng không gian heap [đó là một cái gì đó tôi chưa bao giờ đọc].
Trình biên dịch Java đơn giản là quá thông minh. Hãy thử '" ... ". ToCharArray()' hoặc như vậy. Nhưng sau đó mức thông tin chìm xuống không. –
[this] (http://www.precisejava.com/javaperf/j2se/StringAndStringBuffer.htm) có thể hữu ích – Anirudha
Nó sẽ thuyết phục hơn nếu bạn xây dựng một 'Chuỗi' từ một' StringBuilder', có lẽ bằng cách gọi riêng biệt thường xuyên để nối thêm các phần của giá trị chuỗi. –