`

(转)可能导致Java内存泄漏的几项原因

阅读更多

Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或 JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。

在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达 的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用 的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此不需要考虑这部分的内存泄露。

注意事项:

1、最基本的建议是尽早释放无用对象的引用。如:

……
A a = new A();
//应用a对象
a = null; //当使用对象a之后主动将其设置为空
…

注:如果a 是方法的返回值,不要做这样的处理,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

2、尽量少用finalize函数。它会加大GC的工作量。

3、如果需要使用经常用到的图片,可以使用soft应用类型。它尽可能把图片保存在内存中

4、注意集合数据类型,包括数组、树、图、链表等数据结构,这些数据结构对GC来说,回收更为复杂。

5、尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费

6、尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间

7、尽量避免显式申请数组空间

8、尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

9、尽量在合适的场景下使用对象池技术以提高系统性能。

分享到:
评论

相关推荐

    java之内存泄露

    本文将深入探讨Java内存泄露的原因、表现形式以及预防措施。 #### 二、Java内存回收机制 Java的内存管理机制主要依赖于垃圾回收器(Garbage Collection, GC),这是一种自动化的内存管理方式。当对象不再被引用时,...

    Java内存泄漏原因分析大全

    ### Java内存泄漏原因分析大全 #### 摘要 本文旨在深入探讨Java内存泄漏的各种成因,以及如何预防这些问题的发生。尽管Java虚拟机(JVM)及其内置的垃圾回收机制在很大程度上减轻了开发者手动管理内存的压力,但在...

    JAVA程序内存泄漏综述

    为了有效检测Java内存泄漏问题,可以采用以下几种工具和技术: - **VisualVM**:这是一个免费的可视化工具,可以监控JVM的性能指标,包括内存使用情况,并提供内存快照功能帮助定位内存泄漏。 - **Eclipse Memory ...

    Java中内存泄露及垃圾回收机制.pdf

    在Java中,内存泄露主要由以下几个原因引起: 1. **超出对象的引用范围**:当一个对象的引用超出其生命周期或不再被任何变量引用时,该对象应当被标记为垃圾并最终被垃圾回收器回收。但如果由于某些设计上的失误,...

    java实现的内存分配

    开发者还可以利用Java的内存分析工具(如VisualVM或JProfiler)来监控和诊断内存使用情况,找出可能导致内存泄漏或性能瓶颈的问题。 总的来说,理解和掌握Java中的内存分配策略对于编写高效、健壮的代码至关重要。...

    最详细的java内存讲解

    首先,我们要了解Java内存的几个主要区域:堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)。堆内存是Java对象的主要存储区域,而栈内存...

    图片过大引起的内存溢出解决方案

    3. **释放不再使用的Bitmap对象**:及时回收不再使用的`Bitmap`对象,避免内存泄漏。 #### 四、示例代码分析 下面是一段具体的示例代码,展示如何使用上述方法解决大尺寸图片引起的内存溢出问题: ```java ...

    leaktracker,一个用于android和java的内存泄漏跟踪库。.zip

    内存泄漏是程序开发中常见的问题,尤其是在Android和Java这样的垃圾回收(GC)环境中。LeakTracker是一个专为解决此类问题而设计的开源项目,它帮助开发者检测和追踪内存泄漏,从而提升应用性能和稳定性。 ...

    Java中内存泄露及垃圾回收机制宣贯.pdf

    与C++等语言不同,Java程序员不需要显式地释放内存,这大大减少了内存泄漏的可能性。 垃圾回收器通过一系列算法来判断哪些对象不再被程序使用。主要有以下几种判断标准: 1. 引用计数法:每个对象都有一个引用计数...

    优化Java堆内存大小的五个技巧

    5. **使用内存分析工具**:如MAT (Memory Analyzer Tool) 可以帮助识别内存泄漏或不必要的对象引用。通过分析内存快照,可以发现占用内存最多的类和对象,从而针对性地优化内存使用。 此外,还需注意以下几点: - *...

    JAVA-内存模型.docx

    在Java中,可以通过以下几种方式来防止内存泄漏: 1. **弱引用和软引用**:使用弱引用和软引用来替代强引用,以便更好地控制对象的生命周期。 2. **及时清理资源**:确保在不再使用资源时及时关闭和释放资源。 3. *...

    memory(java).rar_memory_内存管理_内存管理 操作系统_操作系统实验

    这个过程必须防止内存泄漏,即进程不再使用但未释放的内存。 4. 内存保护:为了防止进程间的干扰,操作系统通常会设置内存保护机制,如页表或段表,确保每个进程只能访问其自己的内存空间,防止越界访问。 接下来...

    javacore资料

    总的来说,理解和分析JavaCore日志是一项技术性很强的工作,它要求开发者对Java内存管理机制有深入的理解,并具备一定的问题定位能力。通过这种方式,我们可以有效地优化Java应用的性能,避免因为内存问题导致的服务...

    内存释放工具内存释放工具

    此外,这类工具还可能包含一些附加功能,如监控内存使用情况、分析内存泄漏等。 MemEmpty.exe 是一个具体的内存释放工具的可执行文件,可能是独立的软件应用程序,用户可以通过运行这个文件来执行内存释放操作。在...

    Java中常见异常类型及分析.pdf

    - **内存溢出:** 创建过多的大对象或内存泄露导致内存耗尽。 **解决方法:** - 对于堆栈溢出,限制递归调用的深度,或改用迭代方式实现。 - 对于内存溢出,增加JVM的最大堆内存大小,或优化代码减少不必要的内存...

    android应用内存监控工具

    - 内存泄漏检测:通过比较不同时间点的内存快照,查找可能导致泄漏的对象。 - 进程管理:查看和结束其他应用进程,以释放内存。 - 教程和指南:提供内存管理知识和最佳实践。 五、内存优化策略 1. 使用轻量级数据...

    内存管理 c++ C++内存回收

    内存泄漏虽然可能不会立即引发问题,但随着程序运行时间的增长,累积的未释放内存可能会消耗殆尽,最终导致程序崩溃。 C++内存泄漏的检测通常有以下几种方法: 1. **静态分析工具**:如Cppcheck、Clang-Tidy等,...

    java 优良及差的资源

    2. **静态资源的滥用**:过度依赖静态变量存储资源,可能导致资源无法被正常释放,尤其是在长时间运行的程序中,可能会引发内存泄漏。 3. **长时间保持资源引用**:如果一个对象长时间持有资源的引用,即使资源不再...

    AOSP Android安卓源码mk集成LeakCanary进行内存泄漏检测

    在Android开发过程中,内存泄漏是一个严重的问题,它可能导致应用性能下降、系统资源浪费甚至应用程序崩溃。为了解决这个问题,开发者通常会使用各种工具来检测内存泄漏。LeakCanary就是这样一款强大的内存泄漏检测...

    有关android 內存泄漏的问题

    如果应用程序中存在内存泄漏,即不再使用的对象没有被及时释放,随着时间的推移,累积的未释放内存会导致可用内存减少,最终可能导致OOM。 #### 三、Android系统的内存管理 1. **内存组成**:Android应用的内存...

Global site tag (gtag.js) - Google Analytics