日期:2014-05-20  浏览次数:20822 次

静态方法会导致内存泄漏吗?
我喜欢把一些常用的或者公共方法放到一个工具类里,写成静态(static)的形式,方便调用,但是如果这个方法需要传递一个参数(外部短生命周期对象的引用)的话,会不会造成内存泄漏啊?比如:
[code=java]
public static void getXXX(Object o){
    .....
}
[/code]

这种写法用多了会造成内存泄漏吗?还是只有短周期对象引用一个静态变量时才会导致?

------解决方案--------------------
如果这样会内存泄漏的话,那 Java API 早就泄漏了

我感觉很奇怪,静态方法跟内存泄漏有啥关系?
------解决方案--------------------

如果这样就泄露的话 那就以hibernate的hibernateUtil类 里面得sessionFactory和session都属于这种情况,数据调用那么频繁 也都是短生命的 那岂不早泄露死了
------解决方案--------------------
我来告诉你 可以表情的。。。

技术论坛怎么会死板? 

这么一群闷骚型男。。。

------解决方案--------------------
会还是不会没有意义


这里简单介绍下java虚拟机的内部体系结构,楼主看完应该会明白一点。
 
 一个虚拟机实例的行为分别按照子系统、内存区、数据类型以及指令来描述的。
运行时数据区(内存区)分为,方法区、堆、java栈、PC寄存器、本地方法栈。当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类信息。然后
把这些类信息放到方法区中。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

我们说静态东西的是属于类的而不是对象的。
------解决方案--------------------
静态方法只是说会相对普通方法会长时间存在于内存中(引用),这样也就增加了潜在的威胁。而不管你创建多少个对象,方法(包括静态)都只有一份,只是把地址指向真正的方法,都是共享的只是传递的参数不一样,当你调用这个静态方法传递参数时会把这个参数载入栈中方法调用完毕栈释放,变量引用也销毁了。
静态方法相比于普通方法一个优势是不用创建对象也就少了开销,其实静态方法本身并没“多占”内存。
有时候设计需要像楼主这样设计成静态的是没问题的。