java对象的初始化和清理
初始化和清理
对于初始化和清理(cleanup),C++引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法,Java也采用了构造器,并额外提供了“垃圾回收器”;
1、使用构造器确保初始化 (1)Java中每个类都会有一个initialize()初始化方法:提醒在使用该类对象前,先调用initialize方法;即构造器方法,Java中构造器方法采用与类相同的名称; (2)从概念上来讲,“初始化”和“创建”是相互独立的, 但在Java中,这两个过程是捆绑在一起的; (3)在类的内部,变量定义的顺序决定了初始化的顺序,即使变量定义散布在方法之间,它们仍旧会在任何方法(包括构造器)被调用前初始化; 初始化的顺序是,先静态对象,再非静态对象; Java允许将多个静态初始化动作组织为一个特殊的“静态子句”(“静态块”),如: public class example{ static i; static Cup cup1; static { i = 47; cup1 = new cup1( ); } }
2、清理:确保处理和垃圾回收 Java允许在类中定义一个finalize()方法:一旦垃圾回收器准备好释放对象占用的储存空间,会首先调用finalize方法,并在下一个垃圾回收动作发生时,才会真正回收对象占用的内存; ①对象可能不被垃圾回收; ②垃圾回收不等于“析构”;垃圾回收通常会大量发生在内存濒临溢出的时间,以节省垃圾回收本身的开销; ③垃圾回收只与内存有关; ※在每次对象的生存周期要对内存进行管理,可以在finalize方法中使用Java的本地方法(支持C/C++);
3、垃圾回收器的工作方式 (1)Java垃圾回收器将对象重新排列,实现一种高速地,有无限空间可分配的堆模型; (2)Java垃圾回收器的工作方式:自适应的、分代的 停止-复制(stop-and-copy)方式 + 标记-清扫(mark-and-sweep)方式;
①停止-复制(stop-and-copy)方式: 先暂停程序的运行(不属于后台回收模式),将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,它们的排列方式是一个挨一个的紧密排列; 这种方式的效率比较低,原因为:a.空间:需要两个堆,所以需要维护比实际多一倍的空间; b.复制:程序在进入稳定状态后,可能产生很少的垃圾,这种方式会很浪费资源;
②标记-清扫(mark-and-sweep)方式: 检查是否有新垃圾产生,如果没有,就会转到这种工作方式; 从堆栈和静态储存区出发,遍历所有的引用,找出所有存活的对象,当找到一个存活对象时,会给该对象进行标记,当所有标记完成后,再进行清理; 这种方式的速度很慢;
对于初始化和清理(cleanup),C++引入了构造器(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法,Java也采用了构造器,并额外提供了“垃圾回收器”;
1、使用构造器确保初始化 (1)Java中每个类都会有一个initialize()初始化方法:提醒在使用该类对象前,先调用initialize方法;即构造器方法,Java中构造器方法采用与类相同的名称; (2)从概念上来讲,“初始化”和“创建”是相互独立的, 但在Java中,这两个过程是捆绑在一起的; (3)在类的内部,变量定义的顺序决定了初始化的顺序,即使变量定义散布在方法之间,它们仍旧会在任何方法(包括构造器)被调用前初始化; 初始化的顺序是,先静态对象,再非静态对象; Java允许将多个静态初始化动作组织为一个特殊的“静态子句”(“静态块”),如: public class example{ static i; static Cup cup1; static { i = 47; cup1 = new cup1( ); } }
2、清理:确保处理和垃圾回收 Java允许在类中定义一个finalize()方法:一旦垃圾回收器准备好释放对象占用的储存空间,会首先调用finalize方法,并在下一个垃圾回收动作发生时,才会真正回收对象占用的内存; ①对象可能不被垃圾回收; ②垃圾回收不等于“析构”;垃圾回收通常会大量发生在内存濒临溢出的时间,以节省垃圾回收本身的开销; ③垃圾回收只与内存有关; ※在每次对象的生存周期要对内存进行管理,可以在finalize方法中使用Java的本地方法(支持C/C++);
3、垃圾回收器的工作方式 (1)Java垃圾回收器将对象重新排列,实现一种高速地,有无限空间可分配的堆模型; (2)Java垃圾回收器的工作方式:自适应的、分代的 停止-复制(stop-and-copy)方式 + 标记-清扫(mark-and-sweep)方式;
①停止-复制(stop-and-copy)方式: 先暂停程序的运行(不属于后台回收模式),将所有存活的对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾。当对象被复制到新堆时,它们的排列方式是一个挨一个的紧密排列; 这种方式的效率比较低,原因为:a.空间:需要两个堆,所以需要维护比实际多一倍的空间; b.复制:程序在进入稳定状态后,可能产生很少的垃圾,这种方式会很浪费资源;
②标记-清扫(mark-and-sweep)方式: 检查是否有新垃圾产生,如果没有,就会转到这种工作方式; 从堆栈和静态储存区出发,遍历所有的引用,找出所有存活的对象,当找到一个存活对象时,会给该对象进行标记,当所有标记完成后,再进行清理; 这种方式的速度很慢;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: ElementUI中tree控件踩坑记
- 下一篇: python 生成异教徒头像