静态变量与单例模式对于内存的影响
涉及到的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;
}