标签:
进程空间讲解:
一个进程会分配一块内存空间
进程空间 分为五层空间。
1.Stack(栈)
2.未启用的空间
3.Head(堆)
4.Global Data
5.Text
第一层为栈空间,以帧(stack frame)为单位。
每个帧对应一个函数,保存着函数的参数,局部参数,返回地址。(补充,java中参数和局部变量只能是基本类型和对象的引用) 每调用一新的个函数,就向下增加一个帧,程序控制权就转移到这个函数,并且这个函数被激活。当一个函数结束调用,对应帧就弹出(删除),控制权转移到此时栈顶的帧所对应的那个函数,并且那个函数被激活。
第三层为堆,对是用来存放对象(动态变量)。每增加一个对象,就向上增长。
第四层为全局变量。
第五层为指令集。
这里再介绍一下什么叫栈溢出和什么叫内存泄漏。
栈溢出就是,当栈不断往下占用未启用空间(第二层)时,与堆相遇,则此时,系统报错,称之为栈溢出。
内存泄漏,当对象一直没清理,堆一直往上占用未启用空间,就叫内存泄漏。
垃圾回收:java中,GC只在内存达到上限才会执行。不达到,他是不会浪费时间去进行回收的。
垃圾回收究竟回收的是什么呢?对象,失去引用的对象且是被new出来的对象。那如何找到这些对象呢,算法是什么呢?算法有很多种,起先是计数法,每有引用指向对象,标记加一,反之减一。到零删除。但是当遇到循环引用时,就出现问题。还有其他机制实现垃圾回收制度。
另外,注明JVM的垃圾回收是多种机制的混合,具体使用哪种,电脑会自己判断。
那么那些不是被new出来的对象以及其他东西怎么被清理呢?
当垃圾回收器将要释放一个对象的内存时,它调用该对象的finalize() 方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)
继承finalize()?
顺便,如果你在类中定义了finalize() ,它将不会自动调用基类中的方法。在我们讨论了finalize() 与 C++ 的析构函数的不同点后,对这个结论不会惊讶,因为为某个类定制的清除代码另一个类不一定会需要。
如果你决定要通过派生一个类的finalize() 方法来调用基类中的finalize() 方法,你可以象其他继承方法一样处理。
protected void finalize()
{
super.finalize();
// other finalization code...
}
除了允许你控制是否执行清除操作外,这个技术还使你可以控制当前类的finalize() 方法何时执行。
标签:
原文地址:http://www.cnblogs.com/ddzj/p/4377967.html