【发布时间】:2014-04-07 17:44:30
【问题描述】:
我想问你如何(或如果)有可能减少 Spring 框架的 RAM 占用。
我创建了一个简单的 helloworld 应用来演示这个问题。只有两个类和 context.xml 文件:
-
Main- 带有 main 方法的类 -
Test- 用于模拟一些“工作”的类(printig Hello in无限循环)
context.xml 只包含这个:
<context:component-scan base-package="mypackage" />
测试类只包含名为init的方法,在构造后调用:
@Component
public class Test{
@PostConstruct
public void init() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
System.out.println("Hello " + Thread.currentThread().getName());
Thread.sleep(500);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});
t.start();
}
}
我准备了两个场景,其中main方法只包含一行。
在第一种情况下,主要方法是这样做的:(new Test()).init();
应用程序在没有 Spring 的情况下工作,并且只消耗 aprox。 8MB 内存。
在第二种情况下,主要方法包含以下内容:new ClassPathXmlApplicationContext(new String[]{"spring/context.xml"});
因此应用程序通过 Spring 容器初始化并消耗 aprox。 45MB 内存!
有什么方法可以减少(最好完全摆脱)这个额外的内存?到目前为止,我无法找到任何合适的解决方案。
我不介意启动时是否有额外的内存消耗——这很好,但在那之后,我需要我们的应用程序来减少它。
(这个问题背后的故事有点复杂,但这对我来说现在是核心问题。)
谢谢
【问题讨论】:
-
你是如何测量内存消耗的?
-
如果你想使用 Spring 作为 DI 容器,我建议你尝试一些更轻量级的东西,比如 Guice 或 Dagger。
-
这只是一个想法,(我不知道它是否有效):我希望,当您使用基于 spring java 的配置而不是 xml 配置时,您可以减少占用空间(PermGen),因为我希望 spring 不会加载用于读取文件的 xml 库。
-
@injecteer 我正在使用 Windows 任务管理器,因为实际分配的内存是唯一对我重要的内存。对于其他一切,我使用 JProfiler
-
@Ralph thx 给小费,我试试看