0 0

静态方法会导致内存泄漏吗?10

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


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

一个是短生命周期的对象持有静态,也就是不销毁的变量,这个我能理解。
但是把短生命周期对象引用传递给一个静态方法,我就凌乱了...
系统初始化静态方法的时候,这个短生命周期对象还没传递进去啊?
它们之间到底是什么关系呢?求科普,求解释...

问题补充:
boy00fly 写道
引用
这种写法用多了会造成内存泄漏吗?

这种写法不会造成内存泄漏。为什么不会呢?要想造成内存泄漏,你的工具类对象本身要持有指向传入对象的引用才行!但是当你的业务方法调用工具类的静态方法时,会生产一个称为方法栈帧的东西(每次方法调用,JVM都会生成一个方法栈帧),当方法调用结束返回的时候,当前方法栈帧就已经被弹出了并且被释放掉了。 整个过程结束时,工具类对象本身并不会持有传入对象的引用。

引用
一个是短生命周期的对象持有静态,也就是不销毁的变量,这个我能理解。
但是把短生命周期对象引用传递给一个静态方法,我就凌乱了...

不要凌乱 ,把对象引用传递给静态方法(不是静态方法也是一样的),在调用结束时,工具类对象本身并不会引用传入的对象。所以就没有问题。

可参考http://boy00fly.iteye.com/blog/1096637

谢谢,现在明白多了,回去补下基础知识。
2011年10月22日 11:46

3个答案 按时间排序 按投票排序

0 0

采纳的答案

引用
这种写法用多了会造成内存泄漏吗?

这种写法不会造成内存泄漏。为什么不会呢?要想造成内存泄漏,你的工具类对象本身要持有指向传入对象的引用才行!但是当你的业务方法调用工具类的静态方法时,会生产一个称为方法栈帧的东西(每次方法调用,JVM都会生成一个方法栈帧),当方法调用结束返回的时候,当前方法栈帧就已经被弹出了并且被释放掉了。 整个过程结束时,工具类对象本身并不会持有传入对象的引用。

引用
一个是短生命周期的对象持有静态,也就是不销毁的变量,这个我能理解。
但是把短生命周期对象引用传递给一个静态方法,我就凌乱了...

不要凌乱 ,把对象引用传递给静态方法(不是静态方法也是一样的),在调用结束时,工具类对象本身并不会引用传入的对象。所以就没有问题。

可参考http://boy00fly.iteye.com/blog/1096637

2011年10月24日 14:06
0 0

不会的, 但是不是好习惯. 如果你觉得有地方必须写静态方法(main~~~),我觉得你该想想是不是自己的思路出问题了. 系统会直接给静态方法分配内存.一直到程序运行结束内存才会被释放. 使用方法时对象被传递,不使用不传递.
但愿我的话你能看懂. 语文不好的说~

2011年10月22日 16:49
0 0

去查一下关于变量的作用域,即GC的一些基础知识

2011年10月22日 16:47

相关推荐

    内存泄露静态检测模型

    从面向具体错误的测试思想出发,采用静态测试的方法,给出了内存泄漏的静态检测模型,同时 还引入了区间运算来减少内存泄漏的误报率和漏报率。根据以上模型实现了一个自动测试工具,并已用于软件测试。 关键词 内存泄露...

    Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存

    当我们在Handler对象中使用匿名内部类或非静态内部类时,如果没有正确地释放消息,就可能会导致内存泄漏或增加Native内存。 解决这个问题的方法有两种: 减少notifyItemChanged的调用次数,尽量在数据变化后一次性...

    详细分析内部类的发生内存泄漏的原因

    在这个相关的技巧中,我将带您了解嵌套类的陷阱之一,这是内部类在JVM中导致内存泄漏和内存不足错误的潜力。 之所以会发生这种类型的内存泄漏,是因为内部类必须始终能够访问其外部类-并非总是与JVM的计划一起使用。...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指...如果程序中创建了太多对象,而没有及时释放,将会导致内存溢出。 内存溢出问题是 Java 开发中常见的错误,通过调整容器参数和优化程序代码,可以避免内存溢出的发生。

    android内存泄露:1、LeakCanarys内存泄漏检测库、非静态的内部类错误使用

    一、前言 今天来复习一下有关内存泄露的知识,一个是把之前笔记整理一下,如有一些工具版本更新会写一些...内存泄漏: 指对象不再使用,本该被回收,却因为有其他正在使用的对象持有该对象的引用,而无法被GC回收,

    详解Android性能优化之内存泄漏

    综述 内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经...那么我们在这就来分析一下导致内存泄漏的常见因素并且如何去检测内存泄漏。 导致内存泄漏的常见因素 情景一:静态Activity和View 静态变量Activ

    详解Android内存泄漏检测与MAT使用

    虽然JVM提供了自动垃圾回收机制,但是还是有很多情况会导致内存泄漏。 内存泄漏主要原因就是一个生命周期长的对象,持有了一个生命周期短的对象的引用。这样,会导致短的对象在该回收时候无法被回收。Android中...

    Android内存泄漏的轻松解决方法

    严重的时候可能会导致内存溢出错误,即 OOM Error 下面我们从基础说起 基础知识 Java 的内存分配简述 方法区(non-heap):编译时就分配好,在程序整个运行期间都存在。它主要存放静态数据和常量; 栈区:当...

    浅谈Android应用的内存优化及Handler的内存泄漏问题

    在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出OOM,导致程序卡顿甚至直接退出。 内存泄露(Memory Le

    Android中的内存泄漏

    什么是内存泄漏 长生命周期的对象持有了短生命周期的对象,从而导致短生命周期的对象不能被释放 垃圾回收机制 垃圾回收机制分为:引用计数法、可达性分析法 引用计数法(有循环引用的问题):Python、Object-C、Swift ...

    5个Android开发中比较常见的内存泄漏问题及解决办法

    内存泄漏出现多了,会是应用占用过多的没存,当占用的内存超过了系统分配的内存容量,就会出现内存溢出了导致应用Crash.  了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的Android...

    C语言内存分配详解

    如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。 全局区:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。 文字常量区:例如char *c = “123456”;则”...

    常见的八种导致 APP 内存泄漏的问题1

    1. 静态 Activity 3. 内部类 4. 匿名类

    jprofiler的使用及联调内存溢出解决方案交流

    内存溢出是指计算机程序在运行时,程序申请的内存超出了计算机的最大内存限制,导致程序无法继续运行的情况。jprofiler 可以帮助开发者快速定位内存溢出的源头,找到程序中的内存泄露点,从而解决内存溢出问题。 在...

    Android常见的几种内存泄漏小结

    一、背景 ...由于Android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时,就难免会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。了

    基于汇编语言和静态分析工具

    性能分析: 分析代码以确定可能导致性能问题的部分,如低效的算法或内存泄漏。 规范检查: 检查代码是否符合特定的编程规范或标准,如代码格式、命名规范等。 静态代码复杂度分析: 评估代码的复杂度,以确定

    Android App调试内存泄露之Cursor篇

    最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题...

    java核心面试

    内存泄露与溢出区别,何时产生内存泄露? 编译源代码为本地机器码执行。 内存泄露是一部分内存无法回收。溢出是说内存不够用了。泄露可能在将来会导致溢出 当对象在程序中不会被使用,但却有其他对象持有该对象...

    java核心面试技术点

    内存泄露与溢出区别,何时产生内存泄露? 编译源代码为本地机器码执行。 内存泄露是一部分内存无法回收。溢出是说内存不够用了。泄露可能在将来会导致溢出 当对象在程序中不会被使用,但却有其他对象持有该对象...

    .NET资源泄露与处理方案知识点分享

    .NET虽然拥有强大易用的垃圾回收机制,但并不是因为这样,你就可以对资源管理放任不管,其实在稍不注意的时候,可能就造成了资源泄露,甚至因此导致系统崩溃,到那时再来排查问题就已经是困难重重。 一、知识点简单...

Global site tag (gtag.js) - Google Analytics