3 回答
TA贡献1840条经验 获得超5个赞
system.gc()应该是垃圾回收函数,就是不用的东西就把它收回去,清理出空间来!但是java中的垃圾是自动回收的,它是根据什么来判断要不要把这个变量或对象当作垃圾回收呢?就是根据一个指针,就是说这个变量或对象系统内没有指针指向他了,就是你再想要用这个变量或对象的时候,系统没有办法找到它了,这样就会把他当作垃圾自动回收!就比如说 例子中的 new Book(true);定义的一个无名称的book对象,这个Book 对象他是存在内存里的,但是你能够找到它并且引用它吗?很明显不可以(因为你找不到一个变量指针指向他,所以无法应用呢)。这时候系统就会把它当垃圾回收掉,这就是java 的回收机制!
问题一:
在system.gc()这个调用时,就把你用new Book(true)定义的无名对象给回收了,但是finalize()这个函数要在这个对象“挂掉”之前执行一下!
问题二:
你的问题我也不知道问的是什么,但是根据我的理解
他说的应该是“这个程序调用system.gc的原意是要回收Novel这个book对象的,但是系统的默认回收了却是用new Book(true)定义的无名对象,这样就达不到原来的意图,万一这个对象占用内存很夸张就会导致“头疼的后果”, 所以他建议每个人在写程序的时候最好加finalize()这个函数,确认下到底有没有回收了自己想要回收的东西,从而保证程序的安全性”
问题三:
是调用了两次构造函数,第二次好像不像对吧,它和第一种用法是一样的,只不过是定义了一个没有名字的对象而已
我不知道这个讲的对不对哦,不经常用都忘记了,呵呵,祝你找到一更满意的答案
TA贡献1806条经验 获得超5个赞
问题1:
finalize()方法是object类中的方法,此方法将在对象被销毁的时候调用,被系统认为是垃圾的对象是没有引用的 既 Book b = new Book();当执行b=null;时,该对象没有任何引用指向它,被系统判断为垃圾,垃圾回收机制是系统自己运行的,但也可手动调用既 System.gc()
问题2:
finalize()方法一般用来释放资源,释放被自己所引用的对象,好让垃圾回收器将没用的对象回收,例如打开了一个文件,当此对象将被销毁的时候就一定要判断是否该文件是否被关闭,否则很容易内存溢出,导致程序崩溃
问题3:
确实调用了辆次构造 第一次有引用指向被新构造出来的对象,第二次没有引用指向它,所以调用System.gc()的时候该对象被销毁,销毁前调用了 finalize()方法打印了那句话
TA贡献1799条经验 获得超8个赞
1.System.gc();时调用finalize()方法,你去看下JAVA垃圾回收机制就明白了.你可以将这句注释掉,然后运行看看;
2.在这段程序中第2次new Book(true);未被checkIn,会输出Error: checked out ,如果没有finalize()来验证,你就不知道第2次的new Book(true);未被checkIn,这就是缺陷。
3.是。
添加回答
举报
