Java object方法与GC回收

来源:互联网 发布:千牛和淘宝助理的区别 编辑:程序博客网 时间:2024/06/06 03:13

Object 中的方法:

finalize()//清除资源

hashcode()//获取hashcode   Java hashcode 理解:

1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;

3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;

4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”


toString();

notify()//唤醒对该对象监视的线程,该方法和wait()正好相反互补,wait和notify方法在线程同步上使用,防止数据污染,数据同步等。

wait()//暂时挂起调用该对象的线程

getClass()//获取对象的类名

clone()//复制和该对象一样的对象

equal//判断两个对象是不是相等


jvm 回收的理解:

ava 有个解释器的含义:就是负责对象的创建,内存分配,记录和回收。
Java对象的创建就是在堆上面分配一块地址区域,同时在栈上面创建一个栈结构。在创建栈结构的同时,会记录对象的对应的地址区域,栈是有自己的生命周期的,创建栈是生命的开始,栈弹出就是生命周期的结束。当然栈自己的大小也决定自己的生命周期,主应用的对应一个最大的栈结构。是面对对象编程,那么先是创建对象,也就是创建一个总的栈结构,然后运行对象的方法--这就代表这主线程。是面对结构编程,那么也是需要创建main方法,那么也是要建栈。
从系统而言,cp开始执行是依据栈结构的,其是指向栈结构中的指令一步步执行的。

当这个对象调用完成之后,那么栈结构就完全弹出,那么就会被记录到。栈是一直被跟踪和记录的。
GC创建单向表记录对象的状态,弹出栈的时候就会回收堆地址,所谓的回收堆地址,就是在记录堆的内存分配的记录表中清除这块记录。

Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。

        (1).对象不一定会被回收。

       (2).垃圾回收不是析构函数。

       (3).垃圾回收只与内存有关。

       (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。


调用finalize,是清除对象中的子栈结构(栈结构结束就会被记录到)和数据,不代表这一定接下来就执行GC,执行GC是耗时的。只有jvm内存很低的时候会触发GC.
但是既然一个对象栈结构弹出了,那么里面子栈结构也一定都弹出了,那么为什么还要在回收之前回收finalize。栈虽然弹出来了,不代表内存中的栈区域地址被回收,此时还是占用栈地址的。只有执行了finalize,栈才会被腾空。这是我基于jvm的原理理解而推断的,不过后来查规范的书籍,验证了我的推断。可见深入理解原理,才能让自己的有知更容易获取,更容易扩大,更容易做出准确的推断和判断。
总结:finalize 可以回收栈内存,而GC不能回收栈内存。

0 0
原创粉丝点击