views:

219

answers:

5

I am designing a function (Java method) which will be executed 40-80 times per second on a mobile device.

I want to avoid producing a ton of dead variables which get collected by GC, as the function runs (possibly throughout the life of the app).

In C I might use volatile for example, to prevent the memory allocation of my variables in each execution of the function... I want to do something similar in Java but don't know how.

The function stores data in

  • 1 string
  • 4 integers
  • 2 1-dimensional String arrays

In general, in Java, what is the preferred method for using the above variables but not re-allocating them every time my function is executed (40+ times per second)?

Member variables would "work" but is this the best solution?

Thanks! Brad

+3  A: 
  • Wrap those fields in a class {Java loves to see the Object} and allocate it once and use it.
  • keep string pool concept in mind as you have String array
org.life.java
<s>-1.</s> Using a static field has absolutely nothing to do with how often something is allocated. The ONLY relevant thing is how often objects are created (e.g. how often the `new` operator is used)
Mark Peters
@Mark that is equally true.check my answer
org.life.java
Static means it won't change. The problem is, the variables are calculated during each call to the function.
Brad Hein
@Brad ..check now.static also solves the purpose , but here it is better suited as Object
org.life.java
OK I like the idea of bundling the variables into a class - keeps things clean, and allows for future growth (such as multithreadding support) And I'll read up on string pools. Thanks.
Brad Hein
A: 

I totally agree with that answer.

Every call to your function would allocate more memory if your creating the variables on the fly as Java's GC doesn't fully clean up until destroy is called when the class is being disposed.

But if your going to be calling the function multiple times then just making them member variables of the class would also work.

daynier
A: 

You could use static variables for this, but that assumes that these variables are constants or that changes to them to not badly influence other threads currently calling the same function.

If your code must be reentrant and static variables are not an option, you can create a simple data-holder object which holds these variables and pass it as argument to your function. Your calling environment can decide whether to share these objects or not.

rsp
+1  A: 

Static member vars, they won't get unloaded until the class is unloaded. Keep in mind that if all references to the class are lost it is possible that it can be GC'ed. I doubt that will be an issue in your case however it is worth noting. In addition if you are creating new instances of the class containing the static members vars you will be in the same boat from an allocation stance.

Aaron
A: 

Use either static class fields, or if you are going to create only one instance of your class normal member variables will work.

If you need to change the contents of the String consider using a StringBuilder instead of immutable String instances that will be created/gc'ed.

int's are primitives, so they are not a problem.

Your String arrays will be okay, but think about what you are putting into them. Are you constructing new String objects and letting old ones gc?

Darron