??xml version="1.0" encoding="utf-8" standalone="yes"?>色999国产精品,日韩精品无码一区二区三区,国产精品中文http://www.aygfsteel.com/xieguyue/zh-cnMon, 19 May 2025 00:14:46 GMTMon, 19 May 2025 00:14:46 GMT60JAVA内存泄露问题Q{载)http://www.aygfsteel.com/xieguyue/archive/2007/07/20/131537.htmlxiebinxiebinFri, 20 Jul 2007 10:26:00 GMThttp://www.aygfsteel.com/xieguyue/archive/2007/07/20/131537.htmlhttp://www.aygfsteel.com/xieguyue/comments/131537.htmlhttp://www.aygfsteel.com/xieguyue/archive/2007/07/20/131537.html#Feedback1http://www.aygfsteel.com/xieguyue/comments/commentRss/131537.htmlhttp://www.aygfsteel.com/xieguyue/services/trackbacks/131537.html问题的提?/font>

Java的一个重要优点就是通过垃圾攉?Garbage CollectionQGC)自动理内存的回ӞE序员不需要通过调用函数来释攑ֆ存。因此,很多E序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责QQ而是GC或JVM的问题。其实,q种x是不正确的,因ؓJava也存在内存泄Ԍ但它的表CC++不同?/p>

随着来多的服务器E序采用Java技术,例如JSPQServletQ?EJB{,服务器程序往往长期q行。另外,在很多嵌入式pȝ中,内存的总量非常有限。内存泄露问题也变得十分关键,即每次q行量泄漏Q长期运行之后,pȝ也是面崩溃的危险?/p>

Java是如何管理内?/font>

Z判断Java中是否有内存泄露Q我们首先必M解Java是如何管理内存的。Java的内存管理就是对象的分配和释N题。在Java中,E序员需要通过关键字new为每个对象申请内存空?(基本cd除外)Q所有的对象都在?(Heap)中分配空间。另外,对象的释放是由GC军_和执行的。在Java中,内存的分配是q序完成的Q而内存的释放是有GC完成的,q种收支两条U的Ҏ实化了E序员的工作。但同时Q它也加重了JVM的工作。这也是JavaE序q行速度较慢的原因之一。因为,GCZ能够正确释放对象QGC必须监控每一个对象的q行状态,包括对象的申诗引用、被引用、赋值等QGC都需要进行监控?/p>

监视对象状态是Z更加准确地、及时地释放对象Q而释攑֯象的Ҏ原则是该对象不再被引用?/p>

Z更好理解GC的工作原理,我们可以对象考虑为有向图的顶点,引用关p考虑为图的有向边Q有向边从引用者指向被引对象。另外,每个U程对象可以作ؓ一个图的v始顶点,例如大多E序从mainq程开始执行,那么该图是以mainq程点开始的一|树。在q个有向图中Q根点可达的对象都是有效对象,GC不回收q些对象。如果某个对?(q通子?与这个根点不可?注意Q该图ؓ有向?Q那么我们认?q些)对象不再被引用,可以被GC回收?/p>

以下Q我们D一个例子说明如何用有向图表C内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情c以下右图,是左边E序q行到第6行的C意图?br>
Java使用有向囄方式q行内存理Q可以消除引用@环的问题Q例如有三个对象Q相互引用,只要它们和根q程不可辄Q那么GC也是可以回收它们的。这U方式的优点是管理内存的_ֺ很高Q但是效率较低。另外一U常用的内存理技术是使用计数器,例如COM模型采用计数器方式管理构Ӟ它与有向囄比,_ֺ行低(很难处理循环引用的问?Q但执行效率很高?br>

什么是Java中的内存泄露

下面Q我们就可以描述什么是内存泄漏。在Java中,内存泄漏是存在一些被分配的对象,q些对象有下面两个特点,首先Q这些对象是可达的,卛_有向图中Q存在通\可以与其相连Q其ơ,q些对象是无用的Q即E序以后不会再用这些对象。如果对象满两个条gQ这些对象就可以判定为Java中的内存泄漏Q这些对象不会被GC所回收Q然而它却占用内存?/p>

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

通过分析Q我们得知,对于C++Q程序员需要自q理边和顶点,而对于JavaE序员只需要管理边可以了(不需要管理顶点的释放)。通过q种方式QJava提高了编E的效率?/p>

因此Q通过以上分析Q我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语a上保证,M对象都是可达的,所有的不可辑֯象都由GC理?/p>

对于E序员来_GC基本是透明的,不可见的。虽Ӟ我们只有几个函数可以讉KGCQ例如运行GC的函数System.gc()Q但是根据Java语言规范定义Q?该函C保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能用不同的法理GC。通常QGC的线E的优先U别较低。JVM调用GC的策略也有很多种Q有的是内存使用到达一定程度时QGC才开始工作,也有定时执行的,有的是^~执行GCQ有的是中断式执行GC。但通常来说Q我们不需要关心这些。除非在一些特定的场合QGC的执行媄响应用程序的性能Q例如对于基于Web的实时系l,如网l游戏等Q用户不希望GCH然中断应用E序执行而进行垃圑֛Ӟ那么我们需要调整GC的参敎ͼ让GC能够通过q缓的方式释攑ֆ存,例如垃圑֛收分解ؓ一pd的小步骤执行QSun提供的HotSpot JVM支持这一Ҏ?/p>

下面l出了一个简单的内存泄露的例子。在q个例子中,我们循环甌Object对象Qƈ所甌的对象放入一个Vector中,如果我们仅仅释放引用本nQ那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,q必MVector中删除,最单的Ҏ是Vector对象讄为null?/p>

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o
=new Object();
    v.add(o);
    o
=null;    
}
//此时Q所有的Object对象都没有被释放Q因为变量v引用q些对象?br>

xiebin 2007-07-20 18:26 发表评论
]]>
开始我的java学习路程http://www.aygfsteel.com/xieguyue/archive/2007/05/01/114905.htmlxiebinxiebinMon, 30 Apr 2007 18:47:00 GMThttp://www.aygfsteel.com/xieguyue/archive/2007/05/01/114905.htmlhttp://www.aygfsteel.com/xieguyue/comments/114905.htmlhttp://www.aygfsteel.com/xieguyue/archive/2007/05/01/114905.html#Feedback1http://www.aygfsteel.com/xieguyue/comments/commentRss/114905.htmlhttp://www.aygfsteel.com/xieguyue/services/trackbacks/114905.html

xiebin 2007-05-01 02:47 发表评论
]]>
վ֩ģ壺 ƶ| û| ˻| 㶫ʡ| ÷| ̨| | | ϲ| ԫ| ̫| ̨| | ߺ| | | ˫Ѽɽ| | | ں| Թ| | ٹ| Ϫ| | | | | ʯ| ¤| | Ǩ| | | | Ϫ| °Ͷ| | گ| ʡ| ¡|