1、finalize()
(1)作用:对象占用了某种特殊资源,比如打开了一个文件,使用后资源未被释放,那么可以借助fialnize来处理被疏忽的资源释放工作。
换句话说,finalize的方法是不推荐使用的。我们在使用某种资源后,应正常的释放资源,而不要依靠finalize来处理后续工作。finalize方法不一定会被JVM调用。
(2)工作原理:大致是,垃圾回收器准备处理垃圾时,将首先调用其finalize()方法,在下一次垃圾回收的动作发生时,才会回收对象的内存。
2、垃圾回收
(1)执行前提:垃圾回收不一定会发生,只有当内存濒临用完时,垃圾回收工作才会发生。这样安排是出于对JVM性能的考虑,因为,垃圾回收本身会占用很多资源。
(2)作用:
垃圾回收做两件事情:回收空间;将堆中的对象重新紧凑排列。
将堆中的对象进行重排,目的是留下大块的连续的空闲空间,这样可以提高在堆中分配空间的效率。
(3)算法:有多种算法,基本上都很占系统资源。
题外话:
JVM有很多附件技术来提升速度,JDK中的Java HotSpot技术,在代码每次被执行时都会做一些优化,所以执行的次数越多,它的速度就越快。
这让我联想起另外一件事:我们在做系统部署时,也可考虑让部署脚本在完成部署后,再自动执行一段对系统所有接口的调用——让脚本调用我们写好的客户端程序,程序里包含对系统所有接口的调用。依稀记得一些用maven的工程是这么做的。那么,总的说来,这样做的好处有两个:
(1)用于测试,看看系统的各个功能是否正常,部署是否成功;
(2)赶在用户使用系统之前,让代码先执行一遍,这样可以加快日后执行的速度,改善用户体验。
3、static
(1)作用:让静态数据和静态方法可以被直接使用,而不必创建任何对象,其中,静态数据的所有引用都只指向唯一的一个内存空间,它们共享同一个数据。也就是说,即使静态的数据和方法是在类中定义的,事实上它们与这个类的实例是没有任何关系的。
(2)适用情况:静态数据的适用情况就不必说了,静态方法的适用情况,也许是用于系统的执行入口;或者,“牧羊人的角色——负责看护与其隶属同一类型的实例群”? ......
对于静态方法的调用,一直存在一种疑惑,一直习惯于将某些工具类的方法设置为static,那么将其设置成static和将整个工具类做成单态的,从程序设计上来说,有什么区别呢?
目前考虑到的理由是:若这些方法对于这个工具类来说,并非是高内聚的,也就是说,这些方法相互之间没什么关联,只是找个容器——这个工具类,来定义,那么,就应该是设置成static,因为,它们本来就不该组合成一个对象。
有一种看法认为,静态方法与面向对象的思想是违背的。这样说,似乎有一些道理......
(3)存储:静态数据和静态方法是存储在JVM中的哪一块呢?待查过JVM后才有答案......