2013-05-03 48 views
0

我创建了一个在后台运行的服务 - 它永远不会脱机。静态变量:如何回收内存?

我插入服务的每个较小的模块,我有点担心我需要使用的静态变量。由于父服务总是启动并运行(假设它永远不会停止 - 完美的场景),静态成员不会随着时间的推移占用大量内存吗?它最终会导致我的服务崩溃?

从我所知道的,静态变量持续到程序终止 - 在这种情况下永远不会!

是否有解决方法?我可以以某种方式调用我的独立模块,而不是想到静态变量使用的内存 - 是否有任何方式独立运行,并且最终不会终止我的JVM或服务?

PS - 我不认为我可以取消静态成员,我需要知道是否有一些有效的方式使用静态成员,而不是浪费大量内存。

+0

“我不认为我可以取消静态成员” - 这就是你应该做的。你的“插件”不应该有任何静态数据。 – Mat 2013-05-03 07:05:33

+0

@Mat - 我最终必须这样做。我只是想知道是否有办法处理这种情况,而且你仍然可以使用静态变量。 – divyanshm 2013-05-03 07:09:16

回答

1

我不认为静态数据成员是这里的问题。这只是一个需要考虑的面向对象设计方面,但它与您的记忆问题无关。

您应该首先估计程序所需内存的大小,然后决定是否真的要在应用程序的整个生命周期中将所有这些数据保留在主内存中。这种分析的可能结果可能是:

  1. 数据必须保留,它将适合内存 - 相应地配置您的-Xmx标志并测试您的假设。
  2. 数据必须保留,并且没有足够的空间 - 考虑使用持久性(例如DB)
  3. 数据并不一定要保留 - 考虑使用有界高速缓存,其中旧/不相关数据项被驱逐。
+0

谢谢Eyal!我认为可能有解决方法。我会再次设计这个东西,尽可能避免使用静态变量。 – divyanshm 2013-05-06 06:43:07

0

如果你需要静态变量,那么应该有一个原因。如果静态变量的内容真的是某个类的某些属性,那么它应该进入适当的类。作为程序员,你必须考虑你的设计。根据定义,静态变量总是存在的。这首先是静态的。 如果你需要分配内存,你当然可以只让一个静态指针,然后你可以删除这个全局内存。但是,如果你真的需要这个,那么这听起来像是一个错误的设计。 静态变量绝对不应该是内存问题的根本原因。 如果你加载插件,那么插件负责他们自己的内存管理,并且你无法控制它。