标签:
1. 垃圾回收只与内存有关
在Java中,我们new完对象之后,垃圾回收器负责回收无用的对象占据的内存资源。这与C++不同,在C++中,准许使用局部对象,回收对象时候,需要用到finalize()析构函数。C++的对象创建在堆栈中,而Java对象创建在堆中,所以我们创建完对象之后,Java的垃圾回收器在堆中,会自动帮我们回收垃圾,至于何时回收垃圾,我们不得而知了。
2.垃圾回收用到的方法
(1)finalize()
该方法是用来回收“特殊”的内存,而这内存不是new出来的,所以垃圾回收器无法回收。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在Java中使用的非Java代码,可以调用任何代码,但只能被C和C++调用。所以我们使用finalize()来释放本地方法产生的内存。
(2)System.gc()
该方法不推荐,严重消耗性能,除非万不得已,一般不用。
3.Java垃圾回收器工作
当垃圾回收器工作时候,它一面回收空间,一面是堆中的对象重新排列。通过对堆中的对象重新排列,实现了一种高速的、无限空间的可供分配的堆模型。
4. 简单的垃圾回收技术:引用计数
引用计数:每个对象都有一个引用计数器,当有引用连接至对象时,引用计数器自动加1,当引用离开作用域或被置为null时,引用计数器减1,当对象的引用计数器为0时候,JVM会将对象回收。该方法需要在每一个对象上设置引用计数器,效率很低,而且在对象间循环引用时候,效果不好。
5.Java垃圾回收器的工作机制。
Java虚拟机采取了一种自适应的垃圾回收技术。
停止-复制:先暂停程序(它不属于后台回收模式),然后将所有存活的对象从当前的堆中复制到另一个堆中,没有复制的对象就是垃圾,而被复制到新堆中的对象会紧凑的排列。
标记-清扫:遍历所有引用,进而找出多有存活的对象。当没找到一个存活的对象,就会给对象标记,这个过程中不会清理任何对象。只有全部标记完成之后,才会清理垃圾。
在Java虚拟机运行过程中,如果所有对象稳定,垃圾回收器效率降低的话,就会切换到"标记-清扫";同意,Java虚拟机会跟踪"标记-清扫"效果,要是堆空间出现很多碎片,就会切换到”停止-复制“;
6.Java提升速度的技术:JIT
JIT:just-in-time,及时编辑技术。该技术可以把程序翻译成为本地机器码。在JDK中,会智能的将一些经常使用的.class文件,编译成字节码装入内存,因此Java的执行速度会得到提升。
标签:
原文地址:http://www.cnblogs.com/xumaodun/p/4876110.html