JVM的内存管理 Ⅲ
我们知道类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,为了节省系统内存开销、共享资源,应该将一些变量声明为静态变量。通过下面的例子,你就会发现有什么不同。
代码一:
1 public class MemoryTest {
2 static class Data{
3 private int week;
4 private String name;
5 Data(int i, String s){
6 week = i;
7 name = s;
8 }
9 }
10
11 Data weeks[] = {
12 new Data(1,"monday"),
13 new Data(2,"Tuesday"),
14 new Data(3,"Wednesday"),
15 new Data(4,"Thursday"),
16 new Data(5,"Friday"),
17 new Data(6,"Saturday"),
18 new Data(7,"Sunday")
19 };
20
21 public static void main(String[] args) {
22 final int N = 20000;
23 MemoryTest test = null;
24 for (int i = 0; i <=N; i++) {
25 test = new MemoryTest();
26 }
27 System.out.println(test.weeks.length);
28 }
29 }
代码二:
1 public class MemoryTest {
2 static class Data{
3 private int week;
4 private String name;
5 Data(int i, String s){
6 week = i;
7 name = s;
8 }
9 }
10
11 static Data weeks[] = {
12 new Data(1,"monday"),
13 new Data(2,"Tuesday"),
14 new Data(3,"Wednesday"),
15 new Data(4,"Thursday"),
16 new Data(5,"Friday"),
17 new Data(6,"Saturday"),
18 new Data(7,"Sunday")
19 };
20
21 public static void main(String[] args) {
22 final int N = 20000;
23 MemoryTest test = null;
24 for (int i = 0; i <=N; i++) {
25 test = new MemoryTest();
26 }
27 System.out.println(test.weeks.length);
28 }
29 }
我想大家应该发现上面那两个类的区别了吧!
代码一会在内存中保存20000个weeks的副本,而代码二则在内存中保存1个weeks的副本,然后共享该副本,这样的话就不会造成内存的浪费。
虽然静态的变量能节约大量的内存,但是并不是所有的地方都适合用,建议大家在下列条件都符合的情况下,尽量用静态变量:
(1)变量所包含的对象体积较大,占用内存较多。
(2)变量所包含的对象生命周期较长。
(3)变量所包含的对象数据稳定。
(4)该类的对象实例有对该变量所包含的对象的共享需求。
如果变量不具备上述特点,建议不要轻易使用静态变量,以免弄巧成拙。
最后,再提一点内存的优化,就是有关对象的重用,比如:对象池和数据库连接池等。那样的话,是很节约内存空间的,不过,在用的时候要考虑各个方面,比如:运行环境的内存资源的限制等。为了防止对象池中的对象过多,要记得清除。好了,就到这里吧。