1 栈区 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。比如说,java中的基本数据类型就存在于栈区,int。。。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.
堆区亦称动态内存分配.程序在运行的时候new出来的对象,程序员自己负责在适当的时候释放内存。new出来得对象,动态内存的生存期可以由我们决定,如果我们不释放内存,java的自动回收机制将在最后才释放掉动态内存.但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象
Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也 就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
2 栈的优势是,存取速度比堆快,缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,java垃圾回收器会自动收走这些不再使用的数据。缺点是,由于要在运行时动态分配内存,存取速度较慢。
理解这个对于为什么要分堆和栈就应该知道了吧。
3,A a = new A();中的new A()是用来创建对象的,所创建的对象存在栈中;而a是引用,放在堆中,a中存放的是指向对象地址的值
4,垃圾收集算法的核心思想是:对虚拟机(jvm)可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间。
5,池的概念就是将某种资源缓存起来,不必要每次使用都初始化,使用完释放。使程序的效率得到提高。 |