可以看出上面的两种方式是互补的,所以java虚拟机gc的工作是自适应的。也就是说Jvm会对其进行跟踪,如果所有对象都很稳定,gc工作效率降低就转换到“标记-清扫”方式,如果堆空间出现很多碎片,就会切换到“停止-复制”方式。另外,jvm内存分配方式是以“块”为单位的,较大的对象会单独占有块。大型对象仍然不会被复制,内含小型对象的则会被复制并整理。
一个很重要的问题就是gc只会释放那些用new分配的内存,当JIN时,比如说调用了C语言,那么C用malloc分配的内存就无能为力了。这时fanalize()就出现了,它的工作原理是这样的:一旦垃圾回收机制准备好释放某个对象占用的内存控件时,将会首先调用finalize()方法,当垃圾回收发生时,就会真正回收对象占有的内存。所以用finalize()方法就可以在垃圾回收时刻做一些重要的清理工作。垃圾回收只跟内存有关,所以
finalize()的清理也应该只跟内存有关。
但是垃圾回收机制也是需要资源的,所以不是必要时刻(濒临存储空间用完),垃圾回收不会发生。也就是说finalize()方法并不会保证被调用。