java学习笔记之一《初始化清理》

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——对象依次排列在新堆上,可以直接分配新空间了。、
缺点:
效率低!!! 解决办法:在一个堆的大块内存之间复制对象;
复制带来的浪费—— jvm将检查:if没有新垃圾产生——切换为“标记-清扫”模式
标记-清扫 ——mark-and-swap模式:
从堆栈和静态存储区出发——遍历所有引用——找到所有存活对象;
find one ——mark one;
mark over——清理:释放 unmark 对象,无复制动作; so ——剩余堆空间不连续;
对于这种 自适应-分代-停止复制-标记清扫——垃圾回收器:
内存分配以较大的块为单位; 对象较大时,占据单独快;
块内存使用代数记录是否存活; 块被引用,代数增加;
stop-and-copy做法检查存活对象,将存活对象拷贝到废弃块中;
垃圾回收的定期清理动作——
不对大型对象进行复制——只增加代数;
对内含小对象被复制及整理;
对象稳定——垃圾回收效率降低——切换为mark-and-swap;
空间碎片增多——切换为stop-and-copy;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值