`
wcgdonot
  • 浏览: 92503 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java学习笔记 -- Java的内存管理与内存泄露

    博客分类:
  • Java
阅读更多
    作为Internet最流行的编程语言之一,Java现正非常流行。我们的网络应用程序就主要采用Java语言开发,大体上分为客户端、服务器和数据库三个层次。在进入测试过程中,我们发现有一个程序模块系统内存和CPU资源消耗急剧增加,持续增长到出现java.lang.OutOfMemoryError为止。经过分析Java内存泄漏是破坏系统的主要因素。这里与大家分享在开发过程中遇到的Java内存泄漏的检测和处理解决过程.

    本文先介绍Java的内存管理,以及导致Java内存泄露的原因。

一. Java是如何管理内存

    为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对象引用的那些对象所占用的空间。

    Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。GC为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。

    在Java中,这些无用的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。虽然,我们有几个函数可以访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定义,该函数不保证JVM的垃圾收集器一定会执行。因为不同的JVM实现者可能使用不同的算法管理GC。通常GC的线程的优先级别较低。JVM调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。

二. 什么是Java中的内存泄露

    导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。

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

    这里引用一个常看到的例子,在下面的代码中,循环申请Object对象,并将所申请的对象放入一个Vector中,如果仅仅释放对象本身,但因为Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Vector v = new Vector(10);     
for (int i = 1; i < 100; i++)     
{     
 Object o = new Object();     
 v.add(o);     
 o = null;     
}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。    
实际上这些对象已经是无用的,但还被引用,GC就无能为力了(事实上GC认为它还有用),这一点是导致内存泄漏最重要的原因。 再引用另一个例子来说明Java的内存泄漏。假设有一个日志类Logger,其提供一个静态的log(String msg),任何其它类都可以调Logger.Log(message)来将message的内容记录到系统的日志文件中。

    Logger类有一个类型为HashMap的静态变量temp,每次在执行log(message)的时候,都首先将message的值写入temp中(以当前线程+当前时间为键),在退出之前再从temp中将以当前线程和当前时间为键的条目删除。注意,这里当前时间是不断变化的,所以log在退出之前执行删除条目的操作并不能删除执行之初写入的条目。这样,任何一个作为参数传给log的字符串最终由于被Logger的静态变量temp引用,而无法得到回收,这种对象保持就是我们所说的Java内存泄漏。 总的来说,内存管理中的内存泄漏产生的主要原因:保留下来却永远不再使用的对象引用。
分享到:
评论

相关推荐

    狂神说Java学习笔记-GUI

    【Java GUI】(图形用户界面,Graphical User Interface)是Java编程中不可或缺的一部分,...对于初学者来说,"狂神说Java学习笔记"将是一个宝贵的资源,其中包含的源代码和图片能够直观地展示如何将理论转化为实际应用。

    JAVA学习笔记 林信良

    在内存管理和垃圾回收方面,书中有专门章节讲解Java的内存模型以及自动内存管理机制,解释了如何避免内存泄漏和理解引用类型,这对于优化程序性能和解决内存问题非常有帮助。 书中还详细阐述了异常处理,这是Java...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    java笔记--

    例如,Java使用垃圾回收机制自动管理内存,避免了C++中的内存泄漏问题。 - **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,对象则是类的实例。 - **封装**:通过访问修饰符控制数据的...

    JAVA学习经典笔记-----2

    ### JAVA学习经典笔记知识点概述 #### 一、Java与C++的区别 1. **内存管理:** Java自动管理内存,通过垃圾回收机制自动清理不再使用的对象;而C++需要程序员手动管理内存,容易出现内存泄漏等问题。 2. **平台...

    瑜琅java学习笔记

    瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun Microsystems的一个项目,目标...

    Java学习笔记PPT

    Java的语法与C++有诸多相似之处,但更加强调了内存管理的自动化,例如通过垃圾回收机制来避免内存泄漏。PPT可能包括了变量声明、数据类型(如整型、浮点型、字符型和布尔型)、运算符(算术、比较、逻辑等)以及流程...

    Java学习笔记_内存管理.rar

    这份"Java学习笔记_内存管理.pdf"很可能是详细解析了Java如何进行内存分配、垃圾回收以及内存泄漏等相关概念。下面,我们将深入探讨Java内存管理的一些核心知识点。 1. **Java内存模型**: - **堆内存(Heap)**:...

    java学习笔记总结.doc

    这篇文档是个人的Java学习笔记总结,旨在帮助0基础的学习者从零开始掌握Java基础知识,并逐步成为专业的Java开发者。以下是笔记中涉及的一些关键知识点: 1. **Java开发环境的设置**: 要开始Java编程,首先需要...

    java笔记-面试笔试-2010

    【Java笔记-面试笔试-2010】涵盖了J2SE的基础知识,主要涉及内存管理、垃圾回收(GC)、输入输出(IO)、集合框架(Collection)等Java面试常见主题。以下是对这些知识点的详细说明: 1. **内存管理**: - Java...

    良葛格Java学习笔记(完整版)

    在内存管理方面,笔记可能会涵盖Java的垃圾回收机制,解释了如何自动管理内存,避免内存泄漏,以及如何理解和使用引用类型,比如强引用、软引用、弱引用和虚引用。 接着,笔记会涉及异常处理,这是Java程序健壮性的...

    JAVA学习笔记————————

    4. **内存管理与垃圾回收**:JAVA的自动内存管理是通过垃圾回收机制实现的,学习笔记会解释如何理解和使用这个机制,以及如何避免内存泄漏。 5. **集合框架**:JAVA集合框架是存放和操作对象的容器,包括List、Set...

    清华大学java学习笔记

    "清华大学java学习笔记" 本资源是一个详细的 Java学习笔记,由清华大学编写,涵盖了 Java 语言的概述、发展史、工作原理、特点等多方面的知识点。 Java 语言概述 Java 语言是一种面向对象的编程语言,具有安全、...

    corejava学习笔记

    - GC是Java自动管理内存的一种机制,它负责回收不再使用的对象所占用的内存,避免内存泄露。 6. **集成开发环境(IDE)** - IDE如Eclipse、IntelliJ IDEA等,提供了代码编辑、调试、构建等多种功能,极大地提高了...

    java精华学习笔记

    9. **JVM与内存管理** - 垃圾回收机制:自动回收不再使用的对象,避免内存泄漏。 - 内存区域:堆、栈、方法区、程序计数器、本地方法栈等。 10. **Java集合框架高级话题** - Stream API:用于处理集合的新式编程...

    Java架构面试专题(含答案)和学习笔记-1

    - **内存管理**:包括垃圾回收机制、内存泄漏及其检测方法、JVM内存模型(堆、栈、方法区等)。 - **数据类型与数据结构**:深入理解原始数据类型、引用类型,以及数组、链表、队列、栈等常见数据结构的原理和应用...

    JAVA学习笔记详解

    ### JAVA学习笔记详解 #### 第一讲 Java语言概述 ##### 课前思考: 1. **新的编程语言是否需要借鉴以前的编程语言?** - 新的编程语言在设计时往往会借鉴已有语言的成功经验和失败教训。Java 作为一种相对较新的...

    高质量JAVA程序设计-个人学习笔记

    7. **JVM内存管理**:理解堆内存、栈内存、方法区等区域的工作原理,以及垃圾回收机制,有助于优化程序性能和避免内存泄漏。 8. **设计模式**:笔记中可能涵盖常见的设计模式,如工厂模式、单例模式、观察者模式、...

Global site tag (gtag.js) - Google Analytics