java是怎么分配内存和释放内存的-详解

java的内存管理 对象的分配与释放

分配:

程序员通过new为每个对象申请内存空间(基本类型除外下面有介绍,注意局部变量和对象的实例变量的区别)所有对象都在堆中分配空间;

释放:

对象的释放是由垃圾回收机制决定和执行的,这样极大的简化CG(垃圾处理装置)的负担,当然同时也为程序员带来便利(例如c语言需要手动的去处理已经不在使用的对象,如果遗忘内存就会被越占越多)。

可以分为2大类:堆内存与栈内存

(1)在函数中定义的基本类型变量(即基本类型的局部变量)和对象的引用变量(即对象的变量名指向该对象的内存地址)都在栈内存中分配;

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

(3)堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是运行时动态分配内存的;缺点是运行时动态分配内存,存取速度慢;

(4)栈的优点是存取速度较快仅仅次于CPU中的寄存器,且栈数据可以共享;但是栈中的数据大小和生存期是必须确定的,缺乏灵活性;

(5)只有一个堆区被所有线程共享,堆区不存放基本类型和对象引用只存放对象本身

(6)每个线程包含一个栈区,保存基础数据类型的对象和自定义对象的引用,每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问
还有一个方法区:存储所有对象数据共享区域,存储静态变量和普通方法、静态方法、常量、字符串常量等信息,又叫静态区,是所有线程共享的。

java对象的销毁

Java中垃圾收集器自动地定期扫描Java对象的动态内存,并将所有的引用对象加上标记,在对象运行结束后(无引用变量对该对象进行关联),清除其标记,并将所有无标记的对象作为垃圾进行回收,释放垃圾对象所占的内存空间。

对象运行结束后或生命周期结束时,将成为垃圾对象,但并不意味着就立即会被回收,这时候就要看垃圾回收装置的心情有可能一下子就被回收,也有可能很长时间也不进行回收,仅当垃圾收集器空闲或内存不足时,才会回收他们。

Java中每个对象都拥有一个finalize()方法:gc会调用这个方法对当前对象进行回收.

你可能感兴趣的:(java)