Java内存管理机制

Java内存管理机制


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 代上)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值