Java初始化与清理

本文深入探讨了Java垃圾回收机制的工作原理,包括引用计数、自适应停止-复制+标记-清扫算法,以及对象的初始化顺序。同时,解释了如何在C++中正确释放资源,避免内存泄漏。

finalize()方法:

java有垃圾回收器负责回收无用对象占据的内存资源,

但也有特殊情况:假定你的对象(并非使用new)获得一块“特殊”的内存区域,由于垃圾回收器只知道释放用new分配的内存,所以java允许在类中定义finalize()方法:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时才会真正释放对象占用的内存。

如:java调用本地方法(如C/C++),如C的malloc()函数分配存储空间,需要用free()释放,所以需要在finally()中用本地方法调用


只要程序没有濒临存储空间用完,对象占用的空间总得不到释放(如果有finalize()方法,则不会执行),如果程序执行结束,并且垃圾回收器一直没有释放你创建的任何对象的存储空间,则随着程序的退出,那些资源也会全部交给操作系统(垃圾回收本身也有开销,会降低性能)

必须实施清理:在C++创建一个局部对象(在堆栈上创建),其销毁动作应发生在右花括号的边界(对象的作用欲末尾),如果对象使用new创建,在需要调用delete来执行相应的析构函数,如果忘记delete,则永远不会调用析构函数,出现内存泄露。而java不允许创建局部对象,必须使用new创建对象,但垃圾回收器的存在并不嫩完全代替析构函数,还需要明确调用某个恰当的java方法


垃圾回收器如何工作: 
在某些java虚拟机上,堆的实现像一个传送带,没分配一个新对象,它就往前移动一格,java的“堆指针”只是简单的移动到尚未分配的区域。但事实上又不全像传送带那样工作,不然就会导致频繁的内存页面调度(移进移出硬盘),因为有垃圾回收器的介入,它一面回收空间,一面使堆上的对象紧凑排列,这样“堆指针”就可以很容易移动到更靠近传送带的开始处:
1、引用计数:每个对象都含有一个引用计数器,有引用连接时,计数器加1,引用离开作用域活被置为null时,则减1,简单却速度很慢(虽然管理引用计数的开销不大,但在程序的整个生命周期会持续发生;如果对象间存在循环引用,可能出现“对象应该被回收,而引用计数不为0”,定位这种交互自引用的对象组所需工作量极大)
2、自适应:停止-复制+标记-清扫。前者:先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个对没有复制的全都是垃圾,当对象被复制到新堆时,对象是紧凑排列的(复制时,位于堆或静态存储区的引用可以直接被修正,还有其他可能只想这些对象的引用,需要在便利过程中才能找到)。
复制式回首需要需要维护2倍的空间,而且程序进入稳定状态后,可能之产生少量垃圾,该方法很浪费,因此一些java虚拟己会检查,如果没有新垃圾产生,会转换到”标记-清扫“模式(所以叫自适应)
后者:从堆栈和静态存储区出发,遍历所有的引用,进而找出所偶存活的对象(设置一个标记),全部标记工作完成是,开始清理工作,把没标记的对象释放,其剩下的堆空间是不连续的,需要垃圾回收器整理才能得到紧凑空间。(需要在程序暂停是才能执行)同样,如果堆空间出现很多碎片,则会切换到“停止-复制”模式。

对象初始化:

单个对象初始化顺序:1、分配给对象初始化成二进制零的存储空间,2、静态成员初始化(显式的静态,即static作用域,或静态属性,两者按先后次序初始化),3、非静态成员初始化,4、构造函数初始化

继承对象间的初始化顺序:1、分配空间;2、先后初始化基类及导出类的静态成员;3、依次初始化基类对象的非静态成员以及构造函数;4、依次初始化导出类对象的非静态成员以及构造函数

(单个对象的初始化其实也是按照继承对象间的初始化顺序,因为继承了Object)

数组:int[] a;仅仅分配一个引用,而没有给数组对象本身分配空间,可变参数function(Object... args)

枚举:enum,ordinal()

运行垃圾回收器。
调用 System.gc() 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。等同于Runtime.getRuntime().gc()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值