码迷,mamicode.com
首页 > 其他好文 > 详细

内存管理与垃圾回收

时间:2015-03-30 14:34:37      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

进程空间讲解:

一个进程会分配一块内存空间

进程空间 分为五层空间。

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!