java核心思想学习笔记:chapter5 初始化清理
1.初始化——
java保证:所有变量使用前得到恰当 初始化;
for方法的局部变量——以编译时错误形式保证。for类中基本类型的数据成员(字段)——均有 默认初始值: 类中定义的一个对象引用时,默认初始值为特殊值null;
初始化方式:
指定初始化;
构造器初始化: 无法阻止自动初始化的进行;自动初始在构造器调用之前发生! ;
初始化顺序:
由类内部变量定义的先后顺序决定——类内部变量的初始化在类方法调用之前进行;先静态对象、后非静态;
对于 静态数据static:
类中的静态数据成员只占一份存储区域;static关键字 不可应用于局部变量 ;类中静态数据亦可采用定义处初始化;and静态数据成员的初始化只在必要时进行;
关于 对象的创建过程:note【 构造器为静态方法】
首次创建类对象 or 首次访问类静态方法/域——java解释器必须查找类路径:定位*.class文件;静态初始化只在class对象首次加载时进行一次;(对象首次创建 or 静态数据成员首次被访问)使用new方式创建对象——堆上分配空间;自动将对象中所有基本类型数据成员置为默认值;执行字段定义处的初始化动作;最后执行构造器。
2.垃圾回收及finalize()——
垃圾回收:
java所有对象经由new创建, 不允许创建局部对象;java中的 垃圾回收器只回收经由new分配的内存;对于不使用new 创建的对象——如本地方法中分配的内存;所谓 本地方法:java中调用非java代码的方式——如C语言中使用malloc()分配的内存;java中的垃圾回收——对象可能不被回收,且回收不等于析构;只有程序濒临存储空间用完时,对象占用空间才能被释放——执行垃圾回收。so,一些必要的清理操作——需要自己创建。
类中定义 finalize()方法:
用于实现自定义的必要清理工作——如调用free()方法,释放在调用本地方法过程中的分配的内存;其工作原理——垃圾回收器准备释放“对象占用“内存空间时,先调用finalize(); 在下一次垃圾回收动作发生时,真正回收内存。终结条件及终结动作:当创建的对象不再被需要时,if该对象处于某种预设状态——则允许安全释放;使用 System.gc():强制执行终结动作——调用 finalize() ;
垃圾回收不能完全替代析构函数,也不能直接调用finalize() ——还是需要明确调用某个java方法——这等于使用了析构的概念。
3.java虚拟机采用的一种自适应回收技术——
【stop-and-copy 和 mark-and-swap 均需要在暂停程序的情况下进行】
停止-复制 ——stop -and-sopy做法:first 暂停程序运行(不属于后台回收模式);second 复制所有存活的对象从此堆到彼堆;(need 修正执行它们的引用)end 没有复制的全是垃圾! so——对象依次排列在新堆上,可以直接分配新空间了。、缺点:效率低!!! 解决办法:在一个堆的大块内存之间复制对象;标记-清扫 ——mark-and-swap模式:复制带来的浪费—— jvm将检查:if没有新垃圾产生——切换为“标记-清扫”模式从堆栈和静态存储区出发——遍历所有引用——找到所有存活对象;find one ——mark one;mark over——清理:释放 unmark 对象,无复制动作; so ——剩余堆空间不连续;
对于这种 自适应-分代-停止复制-标记清扫——垃圾回收器:
内存分配以较大的块为单位; 对象较大时,占据单独快;块内存使用代数记录是否存活; 块被引用,代数增加;stop-and-copy做法检查存活对象,将存活对象拷贝到废弃块中;垃圾回收的定期清理动作——
不对大型对象进行复制——只增加代数;
对内含小对象被复制及整理;
对象稳定——垃圾回收效率降低——切换为mark-and-swap;空间碎片增多——切换为stop-and-copy;