首页 新闻 会员 周边 捐助

java编程思想 第5章 初始化与清理 疑惑

0
悬赏园豆:20 [已解决问题] 解决于 2015-08-07 16:09

在Thinking in java 5.5小节中这么写的:

Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假的你的对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放改对象的这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。它的工作原理“假定”是这样子:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

此处有疑惑:

1.既然GC不知道如何回收这种特殊的对象,那么 "一旦垃圾回收器准备好释放对象占用的存储空间" 垃圾回收器还能准备释放该对象的存储?

2.既然GC不知道如何回收这种特殊的对象,那么 "在下一次垃圾回收动作发生时,才会真正回收对象占用的内存" 这是不是相互矛盾?

希望有大神帮忙解答

superzhao的主页 superzhao | 初学一级 | 园豆:184
提问于:2015-08-07 15:20
< >
分享
最佳答案
0

你先回答我,“这种特殊对象”是用 new 获得的吗?

收获园豆:20
Launcher | 高人七级 |园豆:45050 | 2015-08-07 15:45

不是用new获得

superzhao | 园豆:184 (初学一级) | 2015-08-07 15:47

@superzhao: 请问,在 java 中你如何不用 new 获得一个对象?

Launcher | 园豆:45050 (高人七级) | 2015-08-07 15:49

@Launcher: 调用本地方法,如用C语言,malloc()这样的分配内存。

superzhao | 园豆:184 (初学一级) | 2015-08-07 15:51

@superzhao: 好,请你把代码写出来。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 15:53

@Launcher: 我并不会这样做,只是在Thinking in Java里看到了这样的话,想不明白

superzhao | 园豆:184 (初学一级) | 2015-08-07 15:55

@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 | 园豆:45050 (高人七级) | 2015-08-07 16:00

@Launcher: 原来如此! GC可以回收所有以new创建出的对象的内存,用malloc()方式只是创建一块内存区域,并不是创建对象,这块内存需要用finalize()方法调用free()来释放,而不是用GC来回收!
 非常感谢!!

superzhao | 园豆:184 (初学一级) | 2015-08-07 16:07

@superzhao: 你这个疑问是不理解 GC 的工作原理,但是你最初的 2 个疑虑,是你的语文水平问题。

Launcher | 园豆:45050 (高人七级) | 2015-08-07 16:10

@Launcher: 嗯 谢谢! 我会更细心的阅读和思考。

superzhao | 园豆:184 (初学一级) | 2015-08-07 16:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册