首页 > 学习园地 > 网络工程 >
  • 咨询13623339719方便接听。
  • 最新开课:10月29日,需提前报名排座!
  • 学校注重软件与实践结合学习,非单纯软件学习!
  • 咨询电话:0315-2841743 13623339719

唐山短期速成培训之JAVA内存管理

2012-08-01 17:32:41 唐山JAVA培训学校 电话:0315-2841743 QQ:123190168 点击:
分享到:
更多

. 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。

1.Vector v = new Vector(10);      
2.                for (int i = 1; i < 100; i++)      
3.                {      
4. Object o = new Object();      
5. v.add(o);      
6. o = null;      
7.                }//此时,所有的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判断IP教程   下一篇:唐山短期速成培训之JAVA表单验证

我要报名
  • 姓    名:    拟报课程:
  • 住址摘要:
  • QQ  号码:    电话号码:
  • 电话咨询
  • 0315-2841743 [8:00 - 20:00]
  • 短信咨询
  • 13623339719 [8:00 - 20:00]
学校地址:河北唐山市建设路82号(建设路与煤医道交叉口西南角临街) 乘车路线:市内乘7、61、114、35、26、36、16、77、41、28、27等煤医道口下车 自驾有停车场
招生热线:0315-2841743(8:00-20:00)13373059616(休息时间) 邮箱:123190168@qq.com 咨询QQ:123190168(报名咨询QQ) 99558356(装饰工程QQ)
版权所有:唐山电脑培训学校(恒升煤医校区)
声明:未经书面许可,擅自复制、转载、刊登者追究其法律责任!(律师海国志) 支持:济南网络建设