在Thinking in java 5.5小节中这么写的:
Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假的你的对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放改对象的这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样子:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
此处有疑惑:
1.既然GC不知道如何回收这种特殊的对象,那么 "一旦垃圾回收器准备好释放对象占用的存储空间" 垃圾回收器还能准备释放该对象的存储?
2.既然GC不知道如何回收这种特殊的对象,那么 "在下一次垃圾回收动作发生时,才会真正回收对象占用的内存" 这是不是相互矛盾?
希望有大神帮忙解答
你先回答我,“这种特殊对象”是用 new 获得的吗?
不是用new获得
@superzhao: 请问,在 java 中你如何不用 new 获得一个对象?
@Launcher: 调用本地方法,如用C语言,malloc()这样的分配内存。
@superzhao: 好,请你把代码写出来。
@Launcher: 我并不会这样做,只是在Thinking in Java里看到了这样的话,想不明白
@superzhao: 这个留着课后题,你回去好好捉摸捉摸自己的想法是否正确。
"假的你的对象(并非使用new)获得一块“特殊”的内存区域",我之所以先问你,因为你没看懂这句话,这句话不是说对象不用 new 获得,而是说对象不用 new 获得一块“特殊”的内存区域,看明白了吗?
也就是你有这样一个 class,伪码:
class A
{
IntPtr m_pBuffer;
A()
{
m_pBuffer = malloc(1000);
}
void finalize()
{
free(_M_pBuffer);
}
}
A 对象没有用 new ,而是使用 malloc 获得了一块特殊的内存区 m_pBuffer。
A a = new A(); // 还是使用 new 获得对象 A
但是对象 a 本身不用 new 获得的特殊内存区 m_pBuffer,不会被 GC 释放,所以你需要实现 finalize,在里面手动释放。
@Launcher: 原来如此! GC可以回收所有以new创建出的对象的内存,用malloc()方式只是创建一块内存区域,并不是创建对象,这块内存需要用finalize()方法调用free()来释放,而不是用GC来回收!
非常感谢!!
@superzhao: 你这个疑问是不理解 GC 的工作原理,但是你最初的 2 个疑虑,是你的语文水平问题。
@Launcher: 嗯 谢谢! 我会更细心的阅读和思考。