如何设计极其高效的功能

时间:2010-10-12 15:21:18

标签: java optimization memory-management

我正在设计一个功能(Java方法),它将在移动设备上每秒执行40-80次。

我希望避免产生大量由GC收集的死变量,因为该函数运行(可能在应用程序的整个生命周期中)。

在C中我可能会使用volatile来防止在每次执行函数时我的变量的内存分配...我想在Java中做类似的事情,但不知道如何。

该功能将数据存储在

  • 1 string
  • 4个整数
  • 2个1维字符串数组

一般来说,在Java中,使用上述变量的首选方法是什么,但每次执行函数时都不重新分配它们(每秒40次以上)?

成员变量会“起作用”,但这是最好的解决方案吗?

谢谢! 布拉德

5 个答案:

答案 0 :(得分:3)

  • 在类中包装这些字段{Java喜欢看对象}并分配一次并使用它。
  • 保留字符串池概念,因为你有String array

答案 1 :(得分:1)

静态成员变量,在卸载类之前不会卸载它们。请记住,如果对类的所有引用都丢失了,那么它可能是GC的。我怀疑这将是你的问题,但值得注意。此外,如果您要创建包含静态成员变量的类的新实例,您将从分配姿势处于同一条船中。

答案 2 :(得分:0)

我完全赞同这个答案。

如果您在动态创建变量时,每次对函数的调用都将分配更多内存,因为在处理类时,直到调用destroy时,Java的GC才会完全清理。

但是如果您要多次调用该函数,那么只需将它们作为该类的成员变量也可以。

答案 3 :(得分:0)

您可以为此使用静态变量,但这假设这些变量是常量或更改它们以不会严重影响当前调用相同函数的其他线程。

如果您的代码必须是可重入的并且静态变量不是一个选项,您可以创建一个简单的数据持有者对象,该对象保存这些变量并将其作为参数传递给您的函数。您的调用环境可以决定是否共享这些对象。

答案 4 :(得分:0)

使用静态类字段,或者如果您只打算创建一个类的实例,则正常的成员变量将起作用。

如果需要更改String的内容,请考虑使用StringBuilder而不是将创建/ gc'ed的不可变String实例。

int是原语,所以它们不是问题。

你的String数组会没问题,但想想你在他们身上投入了什么。你在构建新的String对象并让旧的对象gc吗?