标签:java内存管理 内存泄露 jvm 垃圾回收机制
Java内存管理是面试中经常会问到的问题。Java的内存管理其实是指对象 的分配和释放问题。曾经看过这样一句话:“C++程序员觉得内存管理太重要了,所以一定要自己进行管理,而Java程序员觉得内存管理太重要了,一定不能自己管理”。我觉得这句话说得太精辟了。
C++程序员需要显式分配内存,释放内存,而这样常常会引起“内存泄露”。而Java程序员不需要显式分配和释放内存,Java在创建对象的时候会自动分配内存,在对象不再使用的时候释放内存。Java的对象是通过new关键字来创建的,创建时会为每个对象申请内存空间(在堆中),Java的内存释放是由垃圾回收机制(GC)决定和执行的。这样的内存管理机制既方便了程序员,也能够减少内存泄露。但是这样会加重JVM的工作,所以java程序的运行速度比较缓慢。
什么是内存泄露呢?内存泄露其实就是存在一些被分配的对象,它们不再被使用了,但GC无法回收,它们将一直占用内存。为什么GC不能回收,就要先了解一下Java的垃圾回收机制了。
Java垃圾回收机制:当对象不再使用时,JVM会自动释放对象所使用的内存。释放内存的原则是对象不再被引用,Java使用软指针(指针不直接指向对象,而是指向对象的引用)来跟踪对象的各个引用。这里有个可达的概念,我们把对象当做有向图的顶点,把引用关系考虑为图的边,有向边从引用对象指向被引用对象。顶点可达的对象就是有效的对象,GC不会进行回收,反之,我们认为这些对象不再被引用,GC将回收这些对象。这个过程程序员不需要参与,可以说对程序员来说是透明的,一般情况下,我们无需显式请求垃圾回收器,因为它是自动运行的,它会不时检查对象的各个引用,回收无应用对象的内存。System类有个静态gc()方法可以运行垃圾回收器,可是它也不能保证能够立即回收对象。另外Java语言其实并不要求JVM一定要有GC,也没有规定GC该如何工作,但是一般JVM都有GC,大部分都用类似的算法去管理内存和执行回收操作。Java的垃圾回收机制是为了所有的Java应用进行服务的,因此任何一个进程都不能命令垃圾回收机制做什么,该怎么做。具体垃圾回收机制大家可以去参考相关的资料。
内存泄露的原因其实就是“保留下来却永远不再使用的对象引用”,这是因为忘记“释放”先前分配的内存。如果程序保留不再使用的对象应用,自动的垃圾回收器又无法证明这些对象不再被使用,为了保证能够回收对象的内存,通常会显式设置对象为null,或者从集合中移除对象。
Author:立礼
Sign:人生不要有太多的幻想,而要有更多的行动。
版权声明:本文为博主原创文章,未经博主允许不得转载。
【Java】Java内存管理
标签:java内存管理 内存泄露 jvm 垃圾回收机制
原文地址:http://blog.csdn.net/lzgs_4/article/details/47159691