У меня есть куча классов, которые я должен настроить для улучшения использования памяти в обмен на процессорное время, и у меня есть junit 3 в качестве тестовой среды, чтобы доказать это.
Хотя я легко могу это сделать (использую string.getBytes("UTF-8");
, заполняю несколько байтов в байте, использую long вместо Date, реализую свои собственные коллекции и т. д.), у меня нет точного способа показать улучшения, когда я фиксирую код, из-за непредсказуемой природы GarbageCollector.
Когда я говорю о сборе мусора, я имею в виду, что я выполнил обе эти две вещи: назвал System.gc()
, И попытался выделить массив следующим образом long[] longs=new long[Integer.MAX_VALUE];
Это несколько алгоритмов, которые я пробовалреализовать безуспешно:
1:
a: сборщик мусора;
b: получить количество используемой памяти в данный момент;(long beforeold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory();
)
c: выделить массив из нескольких десятков тысяч экземпляров моего старого класса;
d: сборщик мусора;
f: long afterold=Runtime.getRuntime().maxMemory - Runtime.getRuntime().freeMemory();
g: повторить процесс создания новых классов
h: сравнить различия в памяти.
Результаты, которые я получил, были странными: мой "afterold" был меньшечем мой «beforeold», указывающий на то, что во время выделения памяти для новых классов произошло какое-то странное событие сбора мусора.
Память, используемая новым экземпляром класса, оказалась в любом месте от отрицательной до положительной, снова сигнализируя о некотором странномсбор мусора в процессе реализации.
Кто-нибудь еще пытался доказать, что некоторые классы более эффективны, чем другие, подобные этому?Это очень крутая проблема, но это все еще проблема.
Спасибо, ребята, вы правите!