您的位置:首页 > 编程语言 > Java开发

Java内存管理机制

2014-12-03 11:32 183 查看
[align=center]Java内存管理机制
[/align]

1. Java的内存区域组成

    Java把内存分两种:一种是栈内存,另一种是堆内存。

(1)在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;

(2)堆内存用来存放由new创建的对象和数组以及对象的实例变量;

    在函数(代码块)中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存则由Java虚拟机的自动垃圾回收器来管理。

2. Java的内存管理

    Java的内存管理就是对象的分配和释放问题。

    分配:在Java中,内存的分配是由程序完成的。程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。

    释放:而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用函数来释放内存,但它只能回收无用并且不再被其它对象引用的那些对象所占用的空间。

3. 分代GC

    Java的内存分为3代:Young, Old, Permanent。大部分对象存储在Young代。

    在Young代中经历数次GC存活的对象可以提升到Old代,大对象也可以直接分配到Old代。

    Permanent代保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。

    Young代由一个Eden和2个survivor组成。大部分的对象的内存分配和回收在这里完成。

    Survivor存储至少经过一次GC存活下来的对象,以增大该对象在提升至old代前被回收的机会。2个survivor中有一个为空。分别为From和to survivor。

    当young代内存满,执行young代GC(minor GC)。

    当old或permanent代内存满,执行full GC(major GC),所有代都被GC。一般先执行young GC,再执行old, permanent GC。

    有时old代太满,以至于如果young GC先运行,则无法存储提升的对象。这时,Young GC不运行,old GC算法在整个堆上运行(CMS collector是个例外,该collector不能运行在young 代上)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: