这是一个测试finilize()的程序:

class fin {
String s = "Begin...";
fin() {
System.out.println(this.s);}
fin(String s) {
System.out.println(this.s + s);}
public void finalize() {
System.out.println("Closing...");}
}

public class t4eleven {
public static void main (String args[]) {

?fin a = new fin("Hello!");
?new fin();
?System.gc();

?new fin();
?fin b = new fin("Hello! again.");
?System.gc();
 }
}
得结果:
Begin...Hello!
Begin...
Begin...
Begin...Hello! again.
Closing...
Closing...

但如果程序改为:
class fin {
String s = "Begin...";
fin() {
System.out.println(this.s); }
fin(String s) {
System.out.println(this.s + s); }
public void finalize() {
System.out.println("Closing..."); }
}

public class t4eleven {
public static void main (String args[]) {

fin a = new fin("Hello!");
?new fin();
?new fin();
?System.gc();

fin b = new fin("Hello! again.");
?System.gc();
 }
}
结果会变成:
Begin...Hello!
Begin...
Begin...
Closing...
Begin...Hello! again.
Closing...
=============

finalize是JVM垃圾回收时调用的,基本上垃圾回收的时间是无法保障的,只要JVM发现一个对象无任何引用了,就会去回收它。
system.gc()只是说明代码建议JVM进行垃圾回收。

===============

/*
Well,垃圾回收是这样的,它的原理是一种编译器技术,
称之为“引用计数”技术,也就是说,每个创建的对象,在
虚拟机的某个地方,保存着对象被引用的数目,如果没有
引用指向某个对象,那么那个对象就是垃圾。

然而JVM不会马上就把那个垃圾回收掉,而要等到JVM发现
内存不足时,它才会将所有的垃圾回收,这样其实更好,
频繁的回收垃圾反而会使系统的效率降低。当然你也可以
显示的调用垃圾回收来回收垃圾(System.gc())。

第一个程序的执行结果
也是错的,应该是:
Begin...Hello!
Begin...
Closing...
Begin...
Begin...Hello! again.
Closing...

为了更好的理解垃圾回收,下面附上一个清晰的例子:
主体还是沿用原代码,不过在fin类中加一个私有的
整型数据id作为对象的标识,再定义一个静态的整型变量
count,来统计fin生成的对象数。构造函数只取无参的,
以下是完整的代码:
*/

//t4eleven.java
class fin
{
int id=0;//记录对象的标识号
static int count=0;//计数生成的对象数

fin()
{
count++;
setID(count);
System.out.println("fin类对象 "+id+" 被构造");
}

private void setID(int id)//设置对象的标识号
{
this.id=id;
}
?
public void finalize()
{
System.out.println("fin类对象 "+id+" 被回收");
}
}

public class t4eleven
{
public static void main (String args[])
{

fin a = new fin();//对象1被构造,并且被a引用
new fin();//对象2被构造,但是个匿名对象,只能引用一次,用完就是垃圾
System.gc();
//对象2被回收,而对象1则因为有a引用,不看作是垃圾,不回收

new fin();//对象3被构造,用完一次就没有指向它的引用了,因而就是垃圾
new fin();//对象4被构造,(同上)
fin b=new fin();//对象5被构造
System.gc();
//对象3和4被回收,而对象5则因为有b引用,不看作是垃圾,不回收??
}
}

/*执行结果:
---------
fin类对象 1 被构造
fin类对象 2 被构造
fin类对象 2 被回收
fin类对象 3 被构造
fin类对象 4 被构造
fin类对象 5 被构造
fin类对象 3 被回收
fin类对象 4 被回收
---------
*/
/*
当new fin()产生一个对象时,
它都是一个匿名的对象(编译器内部会给它一个名称)
而fin a=new fin();做的事情是,先构造一个对象(其实
也可以理解为是匿名的,然后返回它的地址给a,也就说
a引用了那个匿名对象),所以严格的讲,a其实并不是对象
它只是一个对象的引用,只是在JAVA中,为了便于交流
和理解,一致达成共识,将a看作为是一个fin的对象,然而
大家心里都要清楚,它其实是一个对象的引用而已。
*/
==============

“那是否是说情况会由于jvm的不同,在处理的机制上也存在差异,而导致输出结果的次序不同呢?”

“在System.gc()出现的地方不是应该强制执行garbage collection的吗?”

不是强制,只是建议JVM进行垃圾收集,JVM完全有权忽略这个建议

“其实我用的是jdk1.2.1”

估计问题就在这,版本不同结果会不同

?

About Garbage Collector and finilize()相关推荐

  1. Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector

    文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...

  2. 深入理解JVM 一GC(下) G1 Garbage Collector

    文章目录 关于java程序性能 响应能力 吞吐量 G1 Garbage Collector g1收集器的设计目标: G1的设计规划,是要替换掉CMS. 之前的GC收集器对Heap的划分: G1对Hea ...

  3. k8s garbage collector源码分析(1)-启动分析

    k8s garbage collector分析(1)-启动分析 garbage collector介绍 Kubernetes garbage collector即垃圾收集器,存在于kube-contr ...

  4. gc java ibm_gc分析工具(IBM Pattern Modeling and Analysis Tool for Java Garbage Collector)

    分析WAS产生的GC Log的工具,打开详细垃圾回收产生gc log日志文件native_stderr.log 和 native_stdout.log .做gc调优目标,就是减少gc频率和耗时,以及减 ...

  5. jvm ide_通过微调JVM Garbage Collector减少Java IDE滞后

    jvm ide 有没有想过为什么Eclipse / Netbeans会一直暂停一段时间? 特别是当您想向亲爱的同事展示代码中的内容时? 感到尴尬和尴尬,不是吗? 我发现大多数情况下IDE会由于执行垃圾 ...

  6. 通过微调JVM Garbage Collector减少Java IDE滞后

    有没有想过为什么Eclipse / Netbeans会一直暂停一段时间? 特别是在您想向亲爱的同事展示代码中的内容时? 感觉很尴尬和尴尬,不是吗? 我发现大多数时间由于垃圾收集器的执行而导致IDE暂停 ...

  7. AGC027B Garbage Collector

    一道很好的构造题 原题链接 很快就能想到,捡每个垃圾的能量可以最后再算.然后,对于每个垃圾,在路上耗费的能量仅与它是第几个被捡的有关,于是我们考虑将垃圾分组. 首先,我们定义\(F(x,i)\)为某次 ...

  8. AGC027B Garbage Collector 题解

    关于这道题的正解是贪心... 然而还在考场上拼死写dp(不会\(O(N)\)的,表示只想拿到400分) |题目链接| |题解| |AC代码| 这道题我们可以枚举将它分成多少段, 显然对于每一段, 我们 ...

  9. 不建议使用CMS Java Garbage Collector:下一步是什么?

    JDK 9中不赞成使用流行的并发标记扫描(CMS)GC算法.根据 JEP-291 ,已做出此决定以减轻GC代码库的维护负担并加速新开发. 因此,从Java 9开始,如果使用 -XX:+ UseConc ...

最新文章

  1. Javascript使用三大家族和事件来DIY动画效果相关笔记(一)
  2. 8、 IS NULL:空值查询
  3. Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡
  4. 实现简单render函数
  5. 果园机器人作文开头_【360教育】写作技巧丨写作技巧小学高年级作文最全技巧100条,建议收藏!...
  6. 2021年10种最佳数据库管理软件
  7. Qt学习笔记(十九):QTreeWidget 的常用方法
  8. Xshell 4使用
  9. Android 自带截屏命令 screencap 的使用
  10. RC低通滤波器——CR高通滤波器---的使用
  11. 华为服务器2285怎么做系统,华为服务器2285进bios
  12. 你应该知道的 setTimeout 秘密
  13. java学生管理系统无界面 jdbc增删查改
  14. 2021-2027全球与中国成人助听器市场现状及未来发展趋势
  15. css 颤动_颤动-微光效果
  16. ..\OBJ\OLED.axf: Error: L6200E: Symbol Usart_Int multiply defined (by usart_1.o and usart.o).
  17. 针对世纪互联Azure IoT Hub的一种设备下线通知方案
  18. Linux VI文本编辑器
  19. 详细教程—使用闲置树莓派打造“小霸王学习机”
  20. 一个相见恨晚的学习网站,全1080P视频教学!

热门文章

  1. 欧拉定理——数论定理
  2. python-求两个字符串的连续最长公共子串
  3. 简单的python小程序祝福母亲,母亲节快乐!
  4. .net读取Excel批注
  5. 各种数据库总结与页面传值及小技巧等杂汇
  6. ui设计是干啥的: ui设计师主要是做什么的呢
  7. Postman--使用
  8. 【PCB专题】PCB 阻焊层(solder mask)与助焊层(paste mask)有什么区别
  9. JDBC、封装JDBC连接池、第三方连接池工具
  10. Centos8.3 nfs-ganesha使用ceph后端