Các chuyên gia Java nhấn mạnh tầm quan trọng của việc tránh tối ưu hóa sớm và tập trung thay vào thiết kế OO sạch. Tôi đang cố gắng hòa giải nguyên tắc này trong bối cảnh viết lại một chương trình sử dụng một mảng lớn các phần tử dài (một vài triệu). Dường như việc sử dụng một ArrayList sẽ tiêu thụ khoảng 3x bộ nhớ của một mảng nguyên thủy của thời gian dài, và lãng phí nhiều RAM dường như là một mối quan tâm hợp pháp đối với tôi.Danh sách <Double> sử dụng RAM gấp đôi []?
Tôi đang dựa vào thử nghiệm này tôi đã sử dụng lớp MemoryTestBench described here. thử nghiệm và đầu ra của tôi là như sau:
package memory;
import java.util.ArrayList;
import java.util.List;
public class ArrayListExperiment {
public static void main(String[] args) {
ObjectFactory arrayList = new ObjectFactory() {
public Object makeObject() {
List<Long> temp = new ArrayList<Long>(1000);
for (long i=0; i<1000; i++)
temp.add(i);
return temp;
}
};
ObjectFactory primitiveArray = new ObjectFactory() {
public Object makeObject() {
long[] temp = new long[1000];
for (int i=0; i<1000; i++)
temp[i] = i;
return temp;
}
};
MemoryTestBench memoryTester = new MemoryTestBench();
memoryTester.showMemoryUsage(primitiveArray);
memoryTester.showMemoryUsage(arrayList);
}
}
và đầu ra:
memory.ArrayListExperiment$2 produced [J which took 8016 bytes
memory.ArrayListExperiment$1 produced java.util.ArrayList which took 24968 bytes
Câu hỏi của tôi là: Làm thế nào tôi có thể gặt hái những lợi ích của một danh sách OO và vẫn giữ lại bộ nhớ nhỏ của một mảng nguyên thủy ? Tôi nghĩ rằng ổi có thể cung cấp câu trả lời, nhưng liếc qua API nó không rõ ràng với tôi mà lớp học để sử dụng thay cho ArrayList.
Cảm ơn mọi đề xuất.
Đây có phải là MemoryTestBranch đúng không? Tôi đã nhanh chóng đi qua bài báo và thấy một số cách tiếp cận thú vị như System.gc() cái khác cho một vài lần. – rit
Thực ra, điều này nghe có vẻ đúng. Một Double chi phí một tham chiếu, cộng với double nguyên thủy thực tế. Ở mức tối thiểu trong một JVM 64 bit, bạn sẽ trả gấp đôi chi phí cho Double so với bạn sẽ tăng gấp đôi, và có một số chi phí bổ sung. – rfeak
rit, Tôi không đủ điều kiện để nhận xét về sự sạch sẽ của phương pháp trong bài viết đó, nhưng tôi tin rằng kết quả bộ nhớ là chính xác – Jonah