Object方法
clone:用于克隆对象
equals:用于比较两个对象是否相同
getClass:获取到对象的类对象,也就是Class对象
hashCode:获取到对象的hash值
toString:返回对象的字符串表示形式,一般交给子类重写
notify:当对象被当作锁时使用,让出锁使用权,随机唤醒一个阻塞线程
notifyAll:同上,但会唤醒所有线程竞争锁
wait:当对象被当作锁时使用,让出锁使用权,阻塞等待
finalize:用于对象垃圾回收自救,子类重写,将自己和引用链搭上关系,垃圾回收器会调用该方法,搭上关系了就不再清理该对象,但只会调用一次,即如果调用了一次,搭上关系了,后面关系断了,又被垃圾回收器盯上了,那么直接回收,不再给自救的机会。当然也可以用作其它作用,比如清理释放一些资源,当对象被垃圾回收时,finalize中进行一些善后处理,但finalize的调用时机是由垃圾回收器决定的,可能并不会在对象成为垃圾后立马被调用,所以不推荐这种方式,该方法jdk9被标记为过时
为什么finalize方法非常不好,非常影响性能?
非常不好:
FinalizerThread是守护线程,代码很有可能还没来得及执行完,线程就结束了,造成资源没有正确释放
finalize方法中的异常会被吞掉,不抛出,可能不能判断有没有在释放资源时发送错误
影响性能:
重写了finalize方法的对象在第一次被gc时,不能及时释放内存,需要等待FinalizerThread调用完finalize,第二次gc时才能真正释放内存
gc时说明内存本就不足,finalize调用又慢(涉及到队列的移除等操作),finalize中可能还有释放连接资源等耗时操作,不能及时释放内存,这可能会让对象移到老年代(内存担保机制),老年代积累垃圾过多,可能触发full gc
hashCode依赖的字段最好是不变的,如果易变,可能出现这种情况:把一个对象放入map中,然后更改这个对象的属性,那么这个对象的hashCode也会变,那么再get时,就get不出来了!