6、内存泄漏

一、Java内存管理机制

 

  1. 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。
  2. 从申请分配、到使用、再到最后的释放。
  3. 这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。
  4. Java语言对内存管理做了自己的优化,这就是垃圾回收机制。
  5. Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),
  6. 然后由GC(garbage collection)负责自动回收不再使用的内存。

二、垃圾回收机制

 

  1. 我们在实际的项目开发中仍然会遇到内存泄漏的问题。
  2. 也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?
  3. 这个问题,我们需要知道GC在什么时候回收内存对象,什么样的内存对象会被GC认为是“不再使用”的。
  4. Java中对内存对象的访问,使用的是引用的方式。
  5. 在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。
  6. 在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。
  7. GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。
  8. 如果GC线程通过这种方式,无法跟踪到某一块堆内存,那么GC就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。

 

  • 通过这种有向图的内存管理方式,当一个内存对象失去了所有的引用之后,GC就可以将其回收。
  • 反过来说,如果这个对象还存在引用,那么它将不会被GC回收,哪怕是Java虚拟机抛出OutOfMemoryError

三、内存泄漏

 

  1. 一般来说内存泄漏有两种情况。
  2. 一种情况如在C/C++语言中的,在堆中的分配的内存,
  3. 在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);
  4. 另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。
  5. 第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。
  6. 所以,Java中的内存泄漏,主要指的是第二种情况。

四、示例

 

   参见hashCode示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值