Java内存管理机制
2015-12-05 16:09
281 查看
在C++ 语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。 Java 语言对内存管理做了自己的优化,这就是垃圾回收机制。 Java 的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由 GC ( garbage collection)负责自动回收不再使用的内存。
上面是Java 内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。
Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。
package com. *** .widget;
2
3 // : SoftHashMap.java
4 import java.util. * ;
5 import java.lang.ref. * ;
6
7 import android.util.Log;
8
9
112
113
上面是Java 内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存对象会被 GC 认为是“不再使用”的。
Java中对内存对象的访问,使用的是引用的方式。在 Java 代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在 Java 程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。 GC 线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果 GC 线程通过这种方式,无法跟踪到某一块堆内存,那么 GC 就认为这块内存将不再使用了(因为代码中已经无法访问这块内存了)。
package com. *** .widget;
2
3 // : SoftHashMap.java
4 import java.util. * ;
5 import java.lang.ref. * ;
6
7 import android.util.Log;
8
9
112
113
相关文章推荐
- JAVA JTextField 和JTextArea的一般方法
- Java类-Stack的学习
- 转载:Java使用dom4j解析XML
- JAVA读取文件中存在BOM的问题
- c#调用JAVA提供的WebService处理日期格式
- java内存泄露和调优
- Java静态类使用Bean
- java 归并排序
- 详解Java的Spring框架中bean的定义以及生命周期
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 《疯狂JAVA讲义》——instanceof运算符
- 用户权限管理spring security(0积分下载)
- Myeclipse项目无法编译或classes下没有文件 不要慌
- Eclipse中普通文件夹与java包的转换(package,source folder,folder)
- Java反射机制
- JAVA集合类
- eclipse/ADT 安装Gradle
- 基于JDK1.8的String源码学习笔记
- Windows下Eclipse连接hadoop
- 浅析Java的Spring框架中IOC容器容器的应用