`

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示例

  • 大小: 42.7 KB
分享到:
评论

相关推荐

    VC6 内存泄漏检测

    利用VC++6.0撰写内存泄漏检测的方法

    GDB查找内存泄露

    后台程序中经常会存在一部分内存泄露,但是不能很好的定位造成内存泄露的代码,并进行修改,内存泄露不进行修改就会造成程序运行时占用的内存不断升高,逐渐的导致系统的不稳定,现将前一段时间通过GDB调试工具查找内存...

    Android webview 内存泄露的解决方法

    最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递getApplicationContext。 1.避免在xml直接写webview...

    linux 内核 内存泄露检测

    linux 内核 内存泄露检测 linux 内核 内存泄露检测 linux 内核 内存泄露检测 linux 内核 内存泄露检测 linux 内核 内存泄露检测 linux 内核 内存泄露检测 linux 内核 内存泄露检测

    Linux 内存泄露查找

    linux 内存泄露排查文档。 介绍mtrace的使用。根据实际问题介绍如果定位问题。

    Windows内存泄漏排查工具

    LeakDiag和LDGrapher,windows内存泄漏排查工具,用于进行一些泄漏位置的查找以及可视化展示。

    几个内存泄漏的例子

    几个内存泄漏的例子  new和delete要成对使用  new和delete要匹配 经常看到一些C++方面的书籍中这样提及到内存泄漏问题,这样的说法的意思是比较明白,但对于初学C++程序员还是很难掌握,所以下面举几个反面的...

    opencv3和opencv4多线程内存泄漏问题

    opencv3和opencv4多线程内存泄漏问题:以cv::resize函数测试结果为例。 使用中可修复或者可避免内存泄漏:1)使用opencv2的版本;2)在代码中设置修复该问题.

    windows下c++内存泄露检测工具使用方

    windows下c++内存泄露检测工具使用方windows下c++内存泄露检测工具使用方

    electron-vue开发环境内存泄漏问题汇总.docx

    electron-vue开发环境内存泄漏问题汇总.docx

    C++内存泄露检测器

    C++ 内存 泄露 检测器 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题。已经有许多技术被研究出来以应对这个问题

    JS内存泄漏检测工具

    JS内存泄漏检测工具:IEJSLeaksDetector

    检测内存泄漏检测内存泄漏

    检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏 检测内存泄漏

    freertos内存泄漏检测代码(ESP32)

    用于freertos嵌入式实时系统内存泄漏检测,可以实时查看内存状况,具体平台是ESP32

    Android处理内存泄漏的代码例子

    Android处理内存泄漏的代码例子。用于演示避免内存泄漏的几种方法,包括:关闭游标、重用适配、回收图像、注销监听、释放引用。

    JProfiler对应用服务器内存泄漏问题诊断解决方案.docx

    JProfiler对应用服务器内存泄漏问题诊断解决方案

    vld2.5 C++内存泄露检测工具

    VLD是一款用于VisualC++的免费内存泄漏检查工具。可以在codeproject.com网站上找到,相比其它的内存泄漏哦给你根据,他在检查内存泄漏的同事,还具有如下特点: 1) 可以得到内存泄漏点的调用堆栈,如果可以的话,...

    linux下检查内存泄漏的工具+例子

    介绍了使用内存泄漏检测工具valgrind的安装和使用,内附安装包,测试程序,使用说明文档。

    如何解决Java内存泄漏

    如何解决Java内存泄漏

    windbg内存泄漏问题

    windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题windbg内存泄漏问题

Global site tag (gtag.js) - Google Analytics