没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Java 的内存泄漏
Java 的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回
收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为 Java 不存在内存泄漏
问题,或者认为即使有内存泄漏也不是程序的责任,而是 GC 或 JVM 的问题。其实,这种
想法是不正确的,因为 Java 也存在内存泄露,但它的表现与 C++不同。
问题的提出
Java 的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回
收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为 Java 不存在内存泄漏
问题,或者认为即使有内存泄漏也不是程序的责任,而是 GC 或 JVM 的问题。其实,这种
想法是不正确的,因为 Java 也存在内存泄露,但它的表现与 C++不同。随着越来越多的服
务器程序采用 Java 技术,例如 JSP,Servlet, EJB 等,服务器程序往往长期运行。另外,
在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次
运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。
Java 是如何管理内存
为了判断 Java 中是否有内存泄露,我们首先必须了解 Java 是如何管理内存的。Java 的
内存管理就是对象的分配和释放问题。在 Java 中,程序员需要通过关键字 new 为每个对象
申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放
是由 GC 决定和执行的。在 Java 中,内存的分配是由程序完成的,而内存的释放是有 GC
完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了 JVM 的工
作。这也是 Java 程序运行速度较慢的原因之一。因为,GC 为了能够正确释放对象,GC 必
须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等, GC 都需要进
行监控。
监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对
象不再被引用。
为了更好理解 GC 的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考
虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的
起始顶点,例如大多程序从 main 进程开始执行,那么该图就是以 main 进程顶点开始的一
棵根树。在这个有向图中,根顶点可达的对象都是有效对象, GC 将不回收这些对象。如
果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这
些)对象不再被引用,可以被 GC 回收。
以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我
们都有一个有向图表示 JVM 的内存分配情况。以下右图,就是左边程序运行到第 6 行的示
意图。
资源评论
xulianzhen
- 粉丝: 4
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功