JAVA初始化与清理

1.构造器:

这是一个在创建对象时被自动调用的特殊方法,确保初始化,java会在用户有能力操作对象之前自动调用相应的构造器,由编译器调用,与类名相同,无返回值。
(1)不接受任何参数的构造器叫做默认构造器。
(2)如果你没有定义构造器,编译器自动帮你创建默认构造器,但是如果你定义了构造器,编译器就不会再去创建默认构造器。

例子:

class Bird2{
   Bird2(int f){}
   Bird(double d){}
}
public class NoSynthesis{
    public static void main(String[] args){
       Bird2 b=new Bird2();//报错,没有默认构造器
       Bird2 b2=new Bird2(1);
       Bird2 b3=new Bird2(1.8);
      }
}

(3)除构造器之外,编译器禁止在其他任何方法中调用构造器。

2.this:

指出当前对象的引用 如 A a=new A();指出的就是引用a。

3.垃圾回收器:

垃圾回收器只会释放那些经由new分配的内存。

4.finalize()方法:

并非使用new获得的内存区域时,使用该方法释放内存,该区域主要指在java代码中调用了非java代码。也许会调用c的malloc()函数来分配空间,要释放空间得调用free(),但该方法是c、c++中才有的,所以在java中要使用finalize()。当垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。在做清理工作时,我们可以在finalize()里加入某种擦除功能,当垃圾回收发生时,finalize()得到调用,数据就会被擦除,要是垃圾回收没有发生,数据就会保留。
(1)垃圾回收只与内存有关,也就是说使用垃圾回收器的唯一原因是为了回收程序不在使用的内存。无论是垃圾回收,还是终结,都不保证一定会发生。如果jvm并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的。

5.垃圾回收器如何工作:
(1)停止-复制

先暂停程序的运行,然后将所有存活的对象从当前堆复制到另一堆,没有被复制的全是垃圾,当对象被复制到新堆时,它们是一个挨着一个的,所以新堆保持紧凑排列,然后就可以按像传送带一样的方法,每分配一个新对象,就往前移动一格,这样简单、直接地分配新空间了。当把对象从一处搬到另一处时,所有指向它的引用都必须修正。
缺点:效率会降低。原因是,首先,得有两个堆,然后在这两个分离的堆之间来回捣腾,从而得维护比实际需要多一倍的空间。第二个问题,是复制,如果程序只有少量垃圾,或者没垃圾,垃圾回收器仍然会将所有内存自一处复制到另一处,这很浪费。

(2)标记-清扫

虚拟机进行检查,要是没有新垃圾产生,就会转向这一方式,该方式速度相当慢,但是当你知道只会产生少量垃圾甚至不会产生垃圾时,它的速度就很快了。
该方式所依据的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,每当它找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理才会开始。在清理过程中,没有标记的对象将会被释放,不会发生任何复制动作,所以剩下的堆空间是不连续的,垃圾回收器要是希望得到连续空间的话,就得重新整理剩下的对象。

内存会分配较大的“块”,停止-复制要把所有存活对象复制到新堆,会造成大量内存复制行为,有了块之后垃圾回收器,就可以往废弃的块里拷贝对象了,这种好处就是先将空间分配好,执行时,就不需要现去分配空间,减少时间,典型的空间换时间。

java实际垃圾清理是“自适应技术”:java虚拟机会进行监视,如果对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式,同样,java虚拟机会跟踪“标记-清扫”的效果,要是堆空间出现很多碎片,就会切换回“停止-复制”方式。

6.自动初始化:

如果没给基本类型的字段赋值,编译器会给其赋一个默认值,自动初始化会在构造器被调用之前执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值