Я создал два метода тестирования, как показано ниже.Измерение размера объекта строки Java
private static long usedMem = 0;
private static long newUsedMem = 0;
public static long getSize() {
System.gc();
usedMem = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
String s = "test";
String y = "testabcd";
System.gc();
newUsedMem = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
return newUsedMem - usedMem;
}
public static long getSize2() {
System.gc();
usedMem = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
String s = "test";
String y = s+"abcd";
System.gc();
newUsedMem = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
return newUsedMem - usedMem;
}
Я ожидал, что оба метода должны обеспечить одинаковые результаты, поскольку они измеряют размеры строк x и String y. Тем не менее, первый метод постоянно возвращает 0, а второй метод постоянно возвращает 56 (я запускал каждый метод 10 раз в цикле, чтобы убедиться, что работает System.gc()
). более
Одно замечание, что в первом способе, независимо от того, как долго строка s и у есть, результаты не всегда 0.
Может кто-нибудь объяснить различия мне?
Я придумал тест, когда пытался использовать класс MemoryUtil и наблюдал некоторые расхождения. Это мой класс: 'public class Person { String firstName =" Alice "; Строка lastName = "Bob"; } '}' Я использовал измерение «MemoryUtil» и «run time» (аналогично тому, что я делал выше) для измерения размера объекта «Person», когда он инициализирован, но результаты не совпадают. –