Когда я заметил безумно высокий уровень использования ОЗУ в моем клиентском приложении (Swing -на основе ), я начал изучать это, и похоже, что это как-то связано с конфигурацией Spring на основе аннотаций -. Как вы увидите в моих правках ниже, я понял, что это происходит только на 64 -Bit JVM.
См. следующий тестовый код:
xml -конфигурация на основе
<beans....>
<bean id="xmlConfigTest" class="at.test.XmlConfigTest" />
</beans>
public class XmlConfigTest extends JFrame {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/applicationContext.xml");
XmlConfigTest frame = (XmlConfigTest) ctx.getBean("xmlConfigTest");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Использует около 32 МБ памяти, что мне кажется нормальным.
Теперь то же самое с конфигурацией на основе аннотаций :
@Service
public class AnnotationConfigTestFrame extends JFrame {
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = new AnnotationConfigApplicationContext("at.test");
AnnotationConfigTestFrame frame = (AnnotationConfigTestFrame) ctx
.getBean("annotationConfigTestFrame");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
. Мало того, что открытие кадра занимает заметно больше времени, так еще и потребление памяти -взлетает до 160 МБ памяти при запуске, а затем выравнивается примерно до 152 МБ, что мне кажется очень высоким. И помните, это только самый простой случай, клиентское приложение, которое я разрабатываю, уже потребляет более 400 МБ, что слишком много для старых машин.
У кого-нибудь есть объяснение такому поведению? Я не понимаю..
(Кстати, здесь используется 3.1.1.RELEASE.)
редактировать* Как было предложено axtavt, я также попытался построить AnnotationConfigApplicationContext непосредственно с тестовым классом -в качестве аргумента, так что сканирование classpath -не требуется. К сожалению, ничего не изменилось в потреблении памяти.
редактирование 2 удалено, см. редактирование 3
редактировать 3 Теперь я протестировал на той же машине (Windows 7 64 -Bit )с 32 -Bit и 64 -Bit JVM и тестовыми -программами выше. Вот результаты:
конфигурация на основе xml:
32-Bit JVM: 16MB
64-Bit JVM: 31MB
конфигурация на основе аннотаций:
32-Bit JVM: 17MB
64-Bit JVM: 160MB
Итак, на 32 -Bit JVM обе программы близки,что в значительной степени то, что я ожидал. Однако на 64 -бит все по-другому. Даже первая программа использует в два раза больше памяти на 64 -Bit, что уже кажется перебором. Тем не менее, это не имеет ничего против второй программы, которая использует почти в 10 раз больше памяти на 64 -бит.
редактировать 4 Теперь протестировано и под Ubuntu -> тот же эффект. Однако до сих пор не знаю, почему это происходит. Это действительно нарушение условий сделки для меня