About Garbage Collector and finilize()
这是一个测试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()相关推荐
- Java-JVM虚拟机内存垃圾回收机制gc入门:引用类型,对象标记算法,回收算法,常见的 garbage collector
文章目录 GC的优缺点 引用的四种类型 对象标记算法 引用计数法 可达性分析法 回收算法 标记-清除算法(Mark-Sweep) 复制算法 标记-整理算法(Mark-Compact) 分代收集算法 常 ...
- 深入理解JVM 一GC(下) G1 Garbage Collector
文章目录 关于java程序性能 响应能力 吞吐量 G1 Garbage Collector g1收集器的设计目标: G1的设计规划,是要替换掉CMS. 之前的GC收集器对Heap的划分: G1对Hea ...
- k8s garbage collector源码分析(1)-启动分析
k8s garbage collector分析(1)-启动分析 garbage collector介绍 Kubernetes garbage collector即垃圾收集器,存在于kube-contr ...
- 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频率和耗时,以及减 ...
- jvm ide_通过微调JVM Garbage Collector减少Java IDE滞后
jvm ide 有没有想过为什么Eclipse / Netbeans会一直暂停一段时间? 特别是当您想向亲爱的同事展示代码中的内容时? 感到尴尬和尴尬,不是吗? 我发现大多数情况下IDE会由于执行垃圾 ...
- 通过微调JVM Garbage Collector减少Java IDE滞后
有没有想过为什么Eclipse / Netbeans会一直暂停一段时间? 特别是在您想向亲爱的同事展示代码中的内容时? 感觉很尴尬和尴尬,不是吗? 我发现大多数时间由于垃圾收集器的执行而导致IDE暂停 ...
- AGC027B Garbage Collector
一道很好的构造题 原题链接 很快就能想到,捡每个垃圾的能量可以最后再算.然后,对于每个垃圾,在路上耗费的能量仅与它是第几个被捡的有关,于是我们考虑将垃圾分组. 首先,我们定义\(F(x,i)\)为某次 ...
- AGC027B Garbage Collector 题解
关于这道题的正解是贪心... 然而还在考场上拼死写dp(不会\(O(N)\)的,表示只想拿到400分) |题目链接| |题解| |AC代码| 这道题我们可以枚举将它分成多少段, 显然对于每一段, 我们 ...
- 不建议使用CMS Java Garbage Collector:下一步是什么?
JDK 9中不赞成使用流行的并发标记扫描(CMS)GC算法.根据 JEP-291 ,已做出此决定以减轻GC代码库的维护负担并加速新开发. 因此,从Java 9开始,如果使用 -XX:+ UseConc ...
最新文章
- Javascript使用三大家族和事件来DIY动画效果相关笔记(一)
- 8、 IS NULL:空值查询
- Cilium架构:提供并透明地保护应用程序工作负载之间的网络连接和负载平衡
- 实现简单render函数
- 果园机器人作文开头_【360教育】写作技巧丨写作技巧小学高年级作文最全技巧100条,建议收藏!...
- 2021年10种最佳数据库管理软件
- Qt学习笔记(十九):QTreeWidget 的常用方法
- Xshell 4使用
- Android 自带截屏命令 screencap 的使用
- RC低通滤波器——CR高通滤波器---的使用
- 华为服务器2285怎么做系统,华为服务器2285进bios
- 你应该知道的 setTimeout 秘密
- java学生管理系统无界面 jdbc增删查改
- 2021-2027全球与中国成人助听器市场现状及未来发展趋势
- css 颤动_颤动-微光效果
- ..\OBJ\OLED.axf: Error: L6200E: Symbol Usart_Int multiply defined (by usart_1.o and usart.o).
- 针对世纪互联Azure IoT Hub的一种设备下线通知方案
- Linux VI文本编辑器
- 详细教程—使用闲置树莓派打造“小霸王学习机”
- 一个相见恨晚的学习网站,全1080P视频教学!