1、当对象要被回收的时候,调用finalize()2、因为你的程序时一直create object直到,垃圾回收开始
而垃圾回收自动启动的条件就是为程序分配的内存的使用率达到了一定程度,需要进行回收了
所以你new String长度却大,每一个对象占用的内存就越大,当然会提前启动垃圾回收3、还没想出来4、相差1也只是偶然,我有这样的运行结果:
GC after 6116garbages
Created=6116
Finalized= 4
因为垃圾收集是一个后台进程,与你的程序无关
差1的原因应该是:第一个对象被回收的过程正好发生在以下两个语句之间 while(!Garbage.gcrun){
new Garbage();因此,垃圾回收执行的时候,created=3929
但是,new Garbage();的执行使得,created=3930
这里牵扯到多线程的问题
如果楼主还没有看到的话,请先理解多线程机制
而垃圾回收自动启动的条件就是为程序分配的内存的使用率达到了一定程度,需要进行回收了
所以你new String长度却大,每一个对象占用的内存就越大,当然会提前启动垃圾回收3、还没想出来4、相差1也只是偶然,我有这样的运行结果:
GC after 6116garbages
Created=6116
Finalized= 4
因为垃圾收集是一个后台进程,与你的程序无关
差1的原因应该是:第一个对象被回收的过程正好发生在以下两个语句之间 while(!Garbage.gcrun){
new Garbage();因此,垃圾回收执行的时候,created=3929
但是,new Garbage();的执行使得,created=3930
这里牵扯到多线程的问题
如果楼主还没有看到的话,请先理解多线程机制
解决方案 »
- 最近准备写一个基于javamail的电子邮件客户端,请问有什么参考的书籍没
- 模拟 LinkedList iterator 的问题
- 关于synchronized 关键字的困惑
- Class.forName("Gum")为什么不能加载GUM类
- 软件安装用的哪个类?
- 学习Java GUI 需要学awt么?还是直接从swing 开始?
- 这是怎么回事?
- tomcat5.0 怎么去掉启动的时候的提示???
- jdbc的小问题?大力散分了。
- 哎,最近学习遇到N多问题,散分,暂别。。。
- 请问会使用PropertyChangeListener这个接口,谢谢,给分!
- 请求帮助JPanel,JLable放入JScrollPane中能不能实现滚动呀?
不建议用这个方法
第三个问题又怎么理解啊?另:我只是想了解垃圾回收机制,还没有水平用它,呵呵!
[email protected]
谢谢!
但当没调用System.gc()时,gc会由jvm来处理,它会当某个对向真正没被用时才会清理掉,那怎么会使得jvm知道object为g呢?当然,它需要time来检测,有时gc甚至不会被调用,故create=4是有可能的,当您换一个jvm时,create就有可能不为4呢!
如果finalize()只调用一次,那么finalized的值为什么不等于1?finalize()方法,是对象被回收的时候调用
对于每个对象来说它只调用一次
但是你生成了很多个对象呢 ^_^
3、Finalized的值在没有调用System.gc()的时候为什么总是等于4?而在调用了System.gc()之后它的值等于created的值?
调用System.gc()时,终结动作会发生在所有的对象身上。 如果你把它注释掉的话, 垃圾清理只有在 可用内存数量不足 的情况下才执行垃圾回收,所以并非每个对象的finalizers会被执行。
另外,你的程序好像和 thinking in java 上的例程很象, 你可以看看这本书上对它的解释P150。
一个对象被gc回收的时候就只调用一次finalize()方法!
就拿Finalized=4的情况来说
事实上并不是定数,他跟某一次的运行状态有关我在另外一台机器上测试:
注释掉System.gc();
既得到过:Finalized= 3793
也得到过:Finalized= 1497而不注释System.gc();
也同样得到了Finalized= 3793以及Finalized= 1406所以,我认为Finalized= 4仅仅是一个巧合
并不是定论