`
oh_nerd
  • 浏览: 5192 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

初始化和清理,理论的认识垃圾回收

 
阅读更多

第四章:初始化和清理

首先是构造函数,之前有学:构造函数的重载方法是通过参数而非返回类型进行区分的,当用户自定义了构造函数,系统不会再自动定义构造函数。此处对于this这个关键字有了一定的了解:this是对当前对象的引用,它就是个引用。它能用在某个对象的方法中,表示该对象,this在构造函数中使用相当于调用一个符合参数列表的构造函数staitc方法中不存在

this,所以它不能调用非静态的方法或者变量,因为没有对应的引用去指向这些方法和变量。

测试如下:

package com.cedric.thinkingInJava.test;

//?new 返回一个对象的引用,怎么看new的底层运行机制

class Chapter4 {

    public Chapter4() {

       this(5);

       System.out.println("empty");

    }

    public Chapter4(int i) {

       System.out.println(i);

    }

    int i = 0;

    Chapter4 getThis() {

       i++;

       return this;

    }

}

 

public class Chapter4Test {

    public static void main(String[] args) {

       Chapter4 c1 = null;

       c1 = new Chapter4();

       System.out.println(c1.getThis().i);

    }

}

运行结果为:

5

empty

1

其次是清理,理论性的认识了java一直吹捧的垃圾回收功能。除了垃圾回收,另一个清理方式是“终结”操作(finalize())。终结操作存在的原因是:1)对象可能不被垃圾回收2)垃圾回收并不等于“析构”,即垃圾回收只有在JVM内存将要耗尽时才执行,如果需要进行对象的消除,必须自己动手执行清理工作。3)垃圾回收只与内存有关(java中存在一些并非属于java的代码,可能会用到Cmalloc()等,所以finalize()不适合普通的清理)。这里主要是对垃圾回收做了一个了解:

首先明确:只有当JVM面临内存耗尽时才会去执行“垃圾回收”或者“终结”操作。

对象存在于内存中,要消除不用的对象就是对内存的一个操作。JVM中的堆像是一个传送带,每分配一个对象就向前移动一格,“对指针”每次只要指向未分配的区域就行,这样效率会极高。以上只是理想状态,因为要做到堆能够像传送带一样,把已分配的和未分配的完全整理好需要极大的内存页面调度。

为了解决以上问题,就引入了垃圾回收器,它能够在一面回收空间的同时一面使堆中的对象紧凑的排列。

垃圾回收器(GC):简单的理解是每个对象都被分配一个“引用计数”,当给对象添加一个引用时,对应的对象中的“引用计数”就加1,反之就减1,如果“引用计数”为0时,则认为对象不再被使用,将视为垃圾进行释放。这是一个简单的理解,但实际并不会运用该技术,因为当对象之间存在嵌套时,会出现对象不再使用,但是“引用计数”不为0的情况

Dog dog=new Dog()

Tail tail=new Tail();

dog.tail=tail;

Tail.dog=dog;

要消除dog必须先消除tail,但是要消除tail必须先消除dog

实际并不会运用“引用计数”的方式,而是做以下操作:从堆栈中找到所有的引用,对于每一个引用,追踪它引用的对象,然后追踪这个对象的所有引用,如此反复,直到所有引用全部被访问为止,这就解决了上述交互引用的问题。

GC找到对象,并确认它是“活”的,那么会用一种叫“停止-复制”的方法来处理对象:先暂停程序,然后将活的对象全部整齐的复制到另一个堆中,没有复制的就被视为垃圾,被复制的则整齐的排列在了一起。这种方法需要所有引用在复制时都需要进行修正,而且需要两个堆,所以效率会较低。当垃圾很少或者没有的时候,这种方式就不实用了,另一种名为“标记--清扫”的方法则会被使用。它的工作原理就是从堆栈中遍历所有的引用,对每个引用,如果存在活的对象就进行标记,最后没有被标记的就视为垃圾处理,这样会导致堆控件的不连续,但是在没有垃圾或者少量垃圾的前提下是一种高效的方式。两种方式会在JVM中“智能”的切换使用。

最后是初始化。对于以下这个类

class VariableInit{

    int i=0;

    static int j=0;

    VariableInit(){

       i=10;

       j=20;

    }

}

在首次使用该类的静态变量j或者创建该类时,java解释器会先找到VariableInit.class。然后载入VariableInit.class,此时,有关静态的初始化会被执行,且就在加载时执行一次。new VariableInit()这个操作会在堆上分配足够的存储空间,此时存储空间会被自动清零(相当于缺省值的初始化),再会执行所有变量的定义,最后执行构造函数。

所以以上类在创建对象时,首先对静态变量j初始化(如果之前没有调用过j的话),然后执行i的定义,最后执行构造函数。

测试:

System.out.println(VariableInit.j);

VariableInit variableInit=new VariableInit();

System.out.println(variableInit.j);

    输出结果:

    0

10 20

分享到:
评论
2 楼 oh_nerd 2012-06-19  
Pauvrepetiti 写道
顶下啊

现在就看看理论知识
1 楼 Pauvrepetiti 2012-06-18  
顶下啊

相关推荐

    初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt

    初始化和清理是编程中至关重要的概念,特别是...总之,初始化和清理是Java编程中必不可少的环节,包括正确使用构造器初始化对象、理解对象创建过程、掌握垃圾回收机制及其原理,这些都对编写高效、稳定的代码至关重要。

    java初始化和清理

    Java初始化和清理是Java语言中非常重要的两个过程,它们确保了Java程序的正确运行和资源的有效管理。Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性...

    详解Java的初始化与清理

    本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即内存的自动清理。 首先,让我们详细了解一下Java中的构造器初始化。构造器是Java中用于初始...

    第4章 初始化和清理.ppt

    在Java程序设计中,初始化和清理是至关重要的概念,它们涉及到对象的生命周期管理和资源的有效利用。...通过构造函数、函数重载、成员初始化和垃圾回收机制的合理运用,开发者能够构建出更稳定、健壮的软件系统。

    第五章 初始化与清理

    在IT行业中,初始化和清理是程序开发中的关键环节,它们涉及到软件生命周期的开始和结束,确保系统的稳定性和资源的有效管理。本章“第五章 初始化与清理”可能详细探讨了这两个重要概念,特别是在软件工程和系统...

    winform NUNIT的测试初始化和清理

    本文将深入探讨如何在WinForm应用中结合NUnit进行测试初始化和清理工作,以确保测试的准确性和可维护性。 首先,理解NUnit的基础概念至关重要。NUnit是一个开源的.NET测试框架,它提供了一套丰富的断言方法来验证...

    PCI设备BAR空间的初始化

    初始化PCI设备的BAR寄存器和PCI桥的Base、Limit寄存器是为了确保PCI设备能够正确地使用PCI总线进行数据传输。具体步骤包括: 1. **确定地址空间**:系统软件使用DFS算法遍历PCI总线,确定每个PCI设备可用的地址空间...

    基于PLC的生活垃圾回收存放装置设计.pdf

    5. PLC控制系统程序设计:系统程序设计采用模块化结构,由初始化程序、控制程序和故障报警程序组成。初始化程序负责端口和状态扫描,并根据检测结果决定后续操作;控制程序则根据垃圾存放情况调整装置状态,实现垃圾...

    Java性能调优--关于垃圾回收机制的分析和指导

    Java的垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责识别并清理那些不再使用的对象,以释放内存资源。理解并掌握这一机制对于避免内存泄漏和提升系统性能至关重要。 首先,垃圾收集的定义是...

    jvm内存模型以及垃圾回收机制.pptx

    5. **初始化**:执行静态初始化代码块,设置静态变量的最终值。 类加载器分为三种类型: - **引导类加载器**:加载JRE核心库,如`rt.jar`。 - **扩展类加载器**:加载JRE扩展目录下的类库。 - **应用程序类加载器**...

    垃圾回收:在微软.NET框架自动内存管理

    创建对象时,如果托管堆中有足够的空间,系统会将对象的内存分配在堆上,并调用构造函数初始化该对象。对象的内存分配是通过一个指针(NextObjPtr)来管理的,该指针标记了托管堆中下一个新对象应该放置的位置。创建...

    组态王设备初始化失败安装可用

    当设备初始化失败时,可能是因为系统缺乏有效的串行通信支持,而MsComm32控件能提供这个功能,使得软件能够正确识别和通信硬件。 安装MsComm32控件的过程通常包括以下步骤: 1. 下载MsComm32.ocx文件,这是控件的...

    疯狂内核之——内核初始化

    - **准备实模式下C语言环境**: 实现C语言环境的基本设置,如栈和堆的初始化。 - **实模式代码main函数**: - **复制初始化头变量**: 将初始化信息复制到适当的位置。 - **初始化堆**: 为动态内存分配准备空间。 -...

    AutoGC简单的C++垃圾回收器,基于多线程。

    AutoGC是一个针对C++编程语言设计的简单垃圾回收器,主要特点是它采用了多线程技术以及资源获取即初始化(RAII)原则。垃圾回收(GC)通常在动态内存管理中用于自动追踪并释放不再使用的内存,以防止内存泄漏。在C++...

    VC MFC下 的初始化 与结束 顺序过程,是mFC的基础

    在实际开发中,应根据需要覆盖相应的CWinApp成员函数,以实现自定义的初始化和结束逻辑。同时,合理地利用MFC提供的机制,能够确保程序在生命周期中的各个阶段都能正确处理资源,避免内存泄漏和其他问题。

    SIM900A初始化流程

    ### SIM900A 初始化流程详解 #### 一、硬件初始化流程 在开始SIM900A模块的初始化过程之前,首先要确保硬件连接正确无误。...遵循这些步骤,可以有效地初始化和管理SIM900A模块,确保其稳定可靠地运行。

    PIC单片机初始化设置助手

    标题中的“PIC单片机初始化设置助手”是一个专门针对初学者设计的工具,旨在帮助他们更好地理解和操作PIC系列单片机的初始化设置。PIC单片机是由Microchip Technology公司生产的微控制器,广泛应用在各种电子设备中...

    VAX垃圾注册信息全自动清理器

    综合以上信息,我们可以了解到"VAX垃圾注册信息全自动清理器"是一个能自动扫描和修复注册表问题的实用工具,它可能包含一个试用期重置功能(Trial-Reset.exe),以及使用了微软的通用控件库(MSCOMCTL.OCX)来提供...

    Java内存与垃圾回收调优.docx

    垃圾回收器的工作包括标记无用对象、整理内存和回收空间。现代垃圾回收器如G1、ZGC和Shenandoah通过并发和低停顿时间目标来提高性能。优化垃圾回收的目标是减少Stop-The-World事件,提高应用响应速度,同时确保内存...

    清理系统垃圾WYWZ_3.0

    【描述】"WYWZ_3.0 最好+最绝的系统垃圾清理"强调了这款软件在系统清理领域的优秀表现。它可能采用了高效算法,能快速扫描并清除系统中的临时文件、日志、缓存、无效注册表项等垃圾数据。通过这些操作,软件能显著...

Global site tag (gtag.js) - Google Analytics