2、GC-引用类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2、GC-引用类型相关的知识,希望对你有一定的参考价值。

参考技术A 1、引用类型

    为了让程序更好的控制java对象生命周期,让JVM更好的进行垃圾回收,java中提供了5种由强到弱的方式来引用对象:

强引用

    强引用是程序中使用最多的一种引用,我们直接new出来的对象都是用强引用引用的。如String str=new String("abc");只要对象被强引用使用着,就不会被垃圾回收器回收,申请不到内存时会抛出OutOfMemoryError。

软引用(SoftReference)

    软引用用来引用那些可用可无的对象,需要配合引用队列(ReferenceQueue)一起使用,当内存不足时,会被JVM垃圾回收,同时把软引用本身对象放入引用队列中,等待回收。

弱引用(WeakReference)

    弱引用也是用来引用那些可用可无的对象,但引用强度比软引用更低,当垃圾收集线程扫描到弱引用时,不管内存足不足,都会回收其占用的空间,并把弱引用放入关联的引用队列(ReferenceQueue)中,等待回收。

幽灵引用(PhantomReference)

    幽灵引用,又称虚引用。其实被此引用引用的对象对对象的生命周期没任何作用,他存在的主要作用是追踪一些对象的活动信息。必须和QueueReference一起使用。在创建ByteBuffer对象时,会创建一个Cleaner虚引用对象,当无强引用引用时,会进入引用队列,由一个专门的线程进行扫描,然后调用直接内存的方法来进行回收内存空间。

终结器引用(PhantomReference)

    Object中的个finalize方法,所有类的根类都是Object,如果对象重写了finalize方法,那么在运行的时候就会生成一个终结器引用来引用对象,如果对象没有被强引用关联,并且JVM虚拟机还未调用finalize方法,那么执行垃圾回收时,JVM会把终结器引用加入引用队列,由线程优先级很低的Finalizer线程去扫描队列,发现有终结器引用,并进行finalize调用,调用完后,将不定时对此对象进行回收。

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。

 

类的概念

类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。 类定义了类的每个对象(称为实例)可以包含什么数据和功能。

 

类中的数据和函数称为类的成员:数据成员        函数成员

数据成员: 数据成员是包含类的数据--字段,常量和事件的成员。

函数成员: 函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构方法),运算符,和索引器)

 

字段的声明:访问修饰符 类型 字段名称;

方法的声明:访问修饰符 返回值类型 方法名称(参数){ //方法体 }

 

定义一个类来表示一个顾客:

class Customer{
    public string name;
    public string address;
    public int age;
    public string buyTime;
    public void Show(){
        Console.WriteLine("名字:"+name);
        Console.WriteLine("年龄:"+age);
        Console.WriteLine("地址:"+address);
        Console.WriteLine("购买时间:"+buyTime);
    }
}
在这里我们定义了一个类,叫做Customer(顾客),里面包含了四个字段,存储了顾客的名字,年龄,地址和购买时间,包含了一个Show()方法,用来输出自身的一些信息的,在这里Customer就是一个新的数据类型
类似于结构体的定义
struct Customer......;

 

 

如何利用类创建对象:

使用我们自定义的类声明的变量也叫做对象,这个过程也叫做实例化。

ClassName myClass = new ClassName();

其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构造的话,这个对象是无法使用的。

 

构造函数:

我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数。

声明基本的构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。

public class MyClass{

public MyClass()

{ 这个构造函数的函数体 }

}

当我们使用new关键字创建类的时候,就会调用构造方法。 我们一般会使用构造方法进行初始化数据的一些操作。 构造函数可以进行重载,跟普通函数重载是一样的规则

注意: 当我们不写,任何构造函数的时候,编译器会提供给我们一个默认的 无参的构造函数,但是如果我们定义了一个或者多个构造函数,编译器就不会再提供默认的构造函数

 

属性的定义:

属性的定义结构:

public int MyIntProp{
        get{
            // get code
        }
        set{
            //set code
        }
    }

1,定义属性需要名字和类型

2,属性包含两个块 get块和set块

3,访问属性和访问字段一样,当取得属性的值的时候,就会调用属性中的get块,所以get块,类型需要一个返回值就是属性的类型;

      当我们去给属性设置值的时候,就会调用属性中的set块,我们可以在set块中通过value访问到我们设置的值。

 

通过属性来访问字段:

我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值。

private int age;
public int Age{//习惯上属性大写 字段小写
    set{
        if(value<0)return;
        age = value;
    }
    get{
        return age;
    }
}

 

 

设置属性的只读或者只写:

private string name;
public string name{
    get{
        return name;
    }
}
属性可以值只提供一个set块或者get块

 

 

属性的访问修饰符

public string name{
    get{
        return name;
    }
    private set{
        name = value;
    }
}

 

 

自动实现的属性

public int Age{get;set;}
编译器会自动创建private int age属性

 

 

匿名类型(var)

我们创建变量(对象的时候),必须指定类型,其实我们也可以不去指定类型,这个就是匿名类型,我们可以使用var声明一个匿名类型。 使用var声明的匿名类型,当初始化的时候,这个变量的类型就被确定下来,并且以后不可以修改。

var var1 = 34;

 

堆和栈 : 程序运行时的内存区域

我们把内存分为堆 空间和栈空间

栈空间比较小,但是读取速度快 堆空间比较大,但是读取速度慢

 

 

栈的特征: 数据只能从栈的顶端插入和删除 把数据放入栈顶称为入栈(push) 从栈顶删除数据称为出栈(pop)[后进先出] 

堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除

 

 

GC Garbage Collector垃圾回收器:

 

CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。

 

 

 

值类型和引用类型:

类型被分为两种:值类型(整数,bool struct char 小数)和引用类型(string 数组 自定义的类,内置的类)。

值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)

引用类型需要两段内存 第一段存储实际的数据,它总是位于堆中 第二段是一个引用,指向数据在堆中的存放位置

当我们使用引用类型赋值的 时候,其实是赋值的引用类型的引用 如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)

 

以上是关于2、GC-引用类型的主要内容,如果未能解决你的问题,请参考以下文章

JVM中GC Roots及引用类型概述

聊聊 Java GC 算法

jvm引用类型

Java的四种引用类型史上最详细,再也不怕面试官

JVM07:常见的几种垃圾回收器和引用类型

你不可不知的Java引用类型总结篇