当我注意到我的客户端应用程序(基于 Swing)上疯狂的高 RAM 使用率时,我开始研究它,这似乎与 Spring 中基于 Annotation 的配置有关。正如您将在下面的编辑中看到的那样,我意识到这只发生在 64 位 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);
}
}
使用大约 32MB 内存,这对我来说似乎没问题。
现在与基于注释的配置相同:
@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);
}
}
不仅打开框架需要更长的时间,而且内存消耗在启动时飙升至 160MB 内存,然后稳定在 152MB 左右,这对我来说似乎真的很高。请记住,这只是最基本的情况,我开发的 atm 客户端应用程序已经占用了超过 400MB,这对于旧机器来说太多了。
有人对这种行为有解释吗?我不明白..
(顺便说一句,在这里使用 3.1.1.RELEASE。)
编辑* 正如 axtavt 所建议的,我还尝试直接使用 Test-Class 作为参数构造 AnnotationConfigApplicationContext,因此不需要进行类路径扫描。不幸的是,没有改变任何关于内存消耗的事情。
编辑 2已删除,请参阅编辑 3
编辑 3 我现在在同一台机器(Windows 7 64 位)上测试了 32 位和 64 位 JVM 以及上面的测试程序。这是结果:
基于xml的配置:
32-Bit JVM: 16MB
64-Bit JVM: 31MB
基于注释的配置:
32-Bit JVM: 17MB
64-Bit JVM: 160MB
所以在 32 位 JVM 上,两个程序都很接近,这几乎是我所期望的。但在 64 位上,这是不同的。即使是第一个程序在 64 位上使用两倍的内存,这似乎已经太多了。仍然没有反对第二个程序,它在 64 位上使用了近 10 倍的内存。
编辑 4 现在也在 ubuntu 下测试 -> 效果相同。仍然不知道为什么会这样。这对我来说真的是一个交易破坏者