一个类的静态成员方法是不是始终占据内存?
前段时间跟同事讨论一个架构,引出了我之前没想到过的一个问题。
对于如何封装全局函数,我觉得用一个类的静态方法就可以了。但同事说应该用Singleton模式+成员方法,形如:
class Utils
{
Utils gSingleton = null;
private Utils() {}
public static Utils getSingleton()
{
if (null == gSingleton)
gSingleton = new Utils();
return gSingleton;
}
public void function1() {...}
}
调用时:Utils.getSingleton().function1();
他的理由是,这样可以在不再需要使用这些方法时释放掉单例gSingleton,就可以把方法所占的代码空间释放掉了。
是这样吗? 按我以前的理解,只要一个类被虚拟机加载了,它的函数就已经占据了代码段,而不管是否有它的实例对象存在。我理解得不对?
------解决方案--------------------单例的话,那个单例对象还不是一直在内存中占用着?
有些认识上的误区需要更正一下:
1:使用 new 产生对象并不是一种低效的做法,其在堆上分配内存、创建对象等操作已经是高度优化过了的,仅使用 10 个不到的 CPU 指令就完成了,其时间和空间消耗可以忽略不计
2:像一些工具类很明显使用静态方法比较适合,不知道为什么要去使用单例,典型的为了模式而模式
------解决方案--------------------类定义是类定义,对象是对象。
你同事的说法不见得很正确。因为单例中的对象虽然可以被释放(包括其对象属性),但这个对象所对应的类定义并不会被释放。
------解决方案--------------------当类被虚拟机加载后,它的方法就占据了代码段,你的理解是正确的。
如果仅仅是方法,那么两者没有什么很大的区别。单例的最大好处应该是可以进行懒加载(懒汉模式),这时指的是全局对象而不是全局方法了,而且只有当这个对象的代价比较大时单例的优势才能体现出来。
------解决方案--------------------方法是属于类的,类在方法在,类亡方法亡~
只是释放个对象,类本身的class对象木啥影响~
------解决方案--------------------如果仅仅是方法,完全可以忽略内存占用。
一般说占用内存,都是指的成员属性,而不是方法。
所以,我的理解是如果这个类对象的成员属性占用内存不大,完全不必使用单例。
我的理解,一般情况下尽量使用静态模式,因为调用简单,仅此而已。
如果这个类的成员属性非常占内存,则使用单例模式。
------解决方案--------------------单例中的对象虽然可以被释放(包括其对象属性),但这个对象所对应的类定义并不会被释放。
你同事的理解有点小偏差