`
oh_nerd
  • 浏览: 5262 次
  • 性别: 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初始化的主要特性...

    winform NUNIT的测试初始化和清理

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

    PCI设备BAR空间的初始化

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

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

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

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

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

    混沌初始化程序

    fortran编写的logistic映射的混沌程序,用于一般智能优化算法的初始化种群。

    jdk垃圾回收介绍

    这个阶段可以是并行的,也可以是并发的,取决于区域的类型和回收策略。 关于G1的参数设置,以下是一些重要的选项: - `-XX:+UseG1GC`:启用G1垃圾回收器。 - `-Xms` 和 `-Xmx`:分别设置JVM的初始堆大小和最大堆...

    SIM900A初始化流程

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

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

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

    PIC单片机初始化设置助手

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

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

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

    迷你垃圾回收器mini gc for c

    例如,可能会有一个`gc_init()`函数用于初始化垃圾回收器,一个`gc_collect()`函数执行垃圾收集,以及一系列的`gc_malloc()`、`gc_free()`等函数用于内存的申请和释放。 `test.c`文件是用来测试迷你垃圾回收器功能...

    全面分析Java的垃圾回收机制

    例如,通过设置新生代和老年代的比例、设置初始堆大小和最大堆大小等,可以控制垃圾回收的频率和效果。 总的来说,理解Java的垃圾回收机制对于编写高效、稳定的Java应用程序至关重要。开发者应关注内存管理,避免...

    (源码)基于Java虚拟机(JVM)的内存管理与垃圾回收系统.zip

    2. 类加载机制解释了类的加载、链接和初始化过程,包括双亲委派模型和自定义类加载器的实现。 3. 垃圾回收算法介绍了标记清除、复制、标记整理等垃圾回收算法,并详细分析了CMS和G1垃圾收集器的工作原理。 4. JVM...

    java虚拟机垃圾回收详解

    在Java虚拟机的配置方面,有许多参数可以用来调整垃圾回收的行为,例如 `-Xms` 和 `-Xmx` 分别设置JVM初始堆大小和最大堆大小,`-XX:NewRatio` 控制新生代和老年代的比例,`-XX:SurvivorRatio` 设置Eden区与Survivor...

    1_AURIX 应用笔记 TC27xC启动与初始化.pdf

    AURIX TC27X系列启动和初始化,详细介绍了TC27X系列上电BMI配置,初始化步骤,TC27xC TriCore™ AURIX™ 微控器初始化过程, 包括以下步骤: ⇒ 初始化 CPU0 的 C 运行环境( Cstart 程序), AURIX 复位后, CPU0 ...

    捷顺富士IC卡解密软件初始化软件

    然而,为了确保IC卡在这些系统中的安全和顺利运行,往往需要进行一系列的初始化操作。因此,“捷顺富士IC卡解密软件初始化软件”应运而生,它为维护这些智能卡系统的安全与效率提供了一个专业的解决方案。 首先,...

    Activiti 6 mysql5.7初始化数据库

    Activiti 6 mysql5.7初始化数据库

    魔屏初始化应用包

    7. **网络依赖**:初始化和升级过程中,稳定的网络连接至关重要。如果网络不稳定或中断,可能会导致升级失败,用户需要确保设备在整个过程中都能连上互联网。 8. **技术支持**:尽管有了这个初始化应用包,但若在...

Global site tag (gtag.js) - Google Analytics