经过上次面试打击以后,重新振作,重拾JAVA编程思想一书,大概看了基础内容,对本来不太牢固的java基础重新稳固一下,诸如容器:set,map,list,队列,垃圾回收,异常处理,正则表达式等知识都重新翻看了一遍,至今仍在继续学习,准备下一次面试的到来,今天在工作上也完成两件比较棘手的事,心情不错。希望能在接下来的日子能不断学习,不辜负青春韶华,坚持初心,不负梦想。
先来总结一下:
垃圾回收有三种基本方法:1。引用记数,速度慢,并且有一个“对象间存在相互调用时,对象应该被回收,但是引用记数却不为零”,对象没有被正确回收,依然占用内存。原理:每个对象有一个引用计数器,引用连接到对象时,对象的引用记数加1,引用离开作用域,或被置为null,引用记数减去1,引用记数为0时,达到回收条件。
2.停止-复制:先说原理:对任何活的对象,一定能追溯到存活的堆栈或静态存储区之中的引用。从堆栈和静态存储区开始,遍历此对象所有的引用,直到找出那些没有存活在堆栈或静态存储区之中的引用。 先暂停程序运行,将所有存活的对象从当前的堆复制到新的堆,没有被复制的都是垃圾。对象复制到新的堆时,都是保持紧凑队列(顺便把引用重新修正)。再把旧的堆全部清除。
3。程序进入稳定状态时,产生少量的垃圾,这时候停止-复制的方法效果低下,有了新的方式:标记-扫除。在这种状态下,回收速度很快。同样是从堆栈和静态存储区开始,遍历此对象所有的引用,找出那在堆栈或静态存储区之中的活的对象。并给他们加上标记,全部标记工作完成时候,没有标记的对象会被释放,不产生复制的动作,剩下的堆空间不连续。重新整理剩下对象。
即时编译技术,代码执行的次数越多,速度就越快。