Thinking in Java学习笔记 第五章:初始化与清理

this 表示对“调用方法的那个对象”的引用

除构造器以外,编译器禁止在其他任何方法中调用构造器

static方法就是没有this的方法,在static方法的内部,不能调用非静态方法,反过来倒是可以,而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法

finalize()方法:一旦垃圾回收器准备释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,所以钥匙你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。

  • 对象可能不被垃圾回收。
  • 垃圾回收并不等于“析构”(C++销毁对象必须用到这个函数)
  • 垃圾回收只与内存有关:垃圾回收器使用的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()对象),它们也必须同内存及其回收有关。

finalize()的需求被限制到一种特殊情况,即通过某种创建对象方式以外的方式分配了存储空间。不过,Java中一切皆为对象,之所以要有finalize()方法,是由于在分配内存时可能采用了类似C语言的做法,而非Java中的通常做法。这种情况主要发生在“本地方法”的情况下,就是c或者c++的方法,通过malloc()函数分配存储空间,通过free()函数调用空间释放,所以需要在finalize()中用本地方法调用它

finalize方法可以用来对对象终结条件的验证,通过System.gc()方法强制进行终结动作,并重写finalize()方法进行条件验证

垃圾回收器如何工作
垃圾回收器对于提高对象的创建速度有明显的效果,这是Java虚拟机的工作方式。这也意味着,Java从堆分配空间的速度,可以和其他语言从堆栈上分配空间的速度相媲美
在某些Java虚拟机中,堆更像一个传送带,没分配一个新对象,它就往前移动一格。Java的“堆指针”只是简单的移动到尚未分配的区域。
垃圾回收器的介入,当它工作时,将一面回收空间,一面使堆中的对象紧凑排列,这样“堆指针”就可以很容易移动到更靠近传送带的开始出,也就尽量避免了页面错误。通过垃圾回收器对对象的重新排列,实现了一种告诉的,有无限空间可供分配的堆模型。
在这种方式下,Java虚拟机将采用一种自适应的垃圾回收技术。有一种做法为停止-复制,这意味先暂停程序运行,然后将所有存货的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑队列。
但这样效率不高,所以,对一般用途而言,如果你知道只会产生少量垃圾甚至不产生垃圾时,标记-清扫方法的速度将很快。标记-清扫方法在从堆栈和静态存储区出发的遍历过程中,会给每个存活对象设一个标记,等全部遍历完成后开始清理工作,没被标记到的对象将会被释放,但剩下的堆空间将不连续,需要重新整理。

这两种方式都需要在程序暂停的情况下才能进行。

Java虚拟机会进行监视,如果对象稳定,垃圾回收期效率降低的话,就切换到“标记-清扫”方式;同时,如果“标记-清扫方式”的效果让堆空间出现了很多碎片的话就会自动切换回“停止-复制”方式,这就是“自适应”技术。

Java虚拟机中的“即时”编译器技术(JIT Just-In-Time)可以用来提升速度,可以把程序全部或部分翻译成本地机器码。需要加载某个类的时候,编译器先找到.class文件,然后将该类的字节码装入内存。这时有两种方案可以选择:
编译所有代码,但有缺陷:

  • 这种加载动作散落在整个程序生命周期内,累加起来要花很多时间
  • 会增加可执行代码长度。字节码比展开后的本地机器码要短得多
  • 惰性评估:在必要时候才编译代码,Java HotSpot技术就采用了类似方法,每次执行都会做一些优化,执行次数越多,速度越快。

foreach语句是先把数组或者容器中的每个成员赋给参数变量X,然后再进行对X进行操作,并不是赋引用值

可变参数列表不依赖于自动包装机制,而实际上使用的是基本类型

笔记主要是给我自己用来记忆和查阅用,写的比较乱,可能会给你带来困扰,不好意思


欢迎关注我的个人生活博客:小之的个人博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值