静态变量与单例模式对于内存的影响

涉及到的Java内存划分知识

栈内存Stack: 存放方法中的局部变量,局部变量一旦超出作用域,会立刻从栈内存中消失。
堆内存Heap: 初始化的对象存放在堆内存当中,堆内存中的对象都有一个16进制的地址值,其中的数据都有默认值。
方法区Method Area: 存储.class相关信息,包含方法的信息。(但具体方法的执行,在栈内存中进行)

静态方法区Static Method Area: 在方法区内的为静态变量和静态方法划分的一块内存区域。

静态变量

动态变量是在程序执行过程中建立,随函数的调用需要动态的分配存储空间,调用结束释放所占用存储空间的变量。
所以,静态变量中的静态,指的是在整个程序运行过程之处就被分配存储空间,不需要后续调用之时再动态分配的变量。且只有在整个程序运行完毕之后,静态成员变量才会被GC销毁。根据类名称访问静态变量的时候,全程和对象无关,只和类有关。

所有类的对象共享一个类的静态变量,JVM遇到静态成员时,会为其指向到静态区,而非在而不是自己再初始化一个新的。所以对于一些类似SharedPreferences的工具,需要反复使用,并运用同一个不需要改变的变量时,多采用static关键字(有必要时配合final关键字)有助于见效内存消耗。

代码演示如下:

private static SharedPreferencesUtil sp = new SharedPreferencesUtil();

单例模式

其实单例模式也是以静态成员为基础。
其中懒汉式单例模式相对于静态成员的优势在于,可以在需要用到时候再进行初始化,节省一定资源。

private static SharedPreferencesUtil Instance;
private SharedPreferencesUtil() {
	//构造器私有化,阻止其他类初始化该类对象
}

public static SharedPreferencesUtil getInstance() {
	if(Instance == null){
		synchronized{
			if(Instance == null){
				Instance = new SharedPreferencesUtil():
			}
		}
	}
    return Instance;
}

饿汉式单例模式相比静态成员,有继承,多台等形式
代码演示如下:

private static SharedPreferencesUtil Instance = new SharedPreferencesUtil();
private static SharedPreferences sharedPreferences;

private SharedPreferencesUtil() {
	//构造器私有化,阻止其他类初始化该类对象
}

public static SharedPreferencesUtil getInstance() {
    return Instance;
}

你可能感兴趣的:(静态变量与单例模式对于内存的影响)