Java垃圾回收机制介绍

2019-04-04  本文已影响0人  测试老杨

Java垃圾回收机制

Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收。

学生删除功能分析

运行学生管理系统,在控制台录入5名学生的数据,然后将第3名学生王五从系统里面删除,会导致王五后面的学生向前移动,并且最后一个学生空间会被更新为null。另外,王五被删除后,该学生由于没有被任何引用变量所引用,成为了垃圾数据,最终会被Java垃圾回收工具回收。王五这个学生的学号,年龄等成员属性(成员变量)的生命周期为从该学生被创建一直到被Java垃圾回收机制回收。


image.png

添加5名学生

image.png

使用监控工具查看学生实例

image.png

删除第3个学生王五

image.png

使用监控工具查看学生数组

image.png

使用监控工具查看学生实例

image.png

学生类的源代码

package day07;

public class Student {
    
    static{
        System.out.println("学生模板被加载");
    }
    
    
    int sid;//成员变量
    String sname;
    int age;
    boolean isMale;
    public static int count;//表示学生的数量
    
    
    
    /**
     * 查询学生的年龄
     * @return
     */
    public int getAge() {
        return age;
    }

    /**
     * 修改学生的年龄
     * @param age
     */
    public void setAge(int age) {
        if(age>=1){
            this.age = age;
        }
    }

    public Student(){
        
    }
    
    /**
     * 
     * @param sid       表示学号
     * @param sname     表示姓名
     * @param age       表示年龄
     * @param isMale    表示性别
     */
    public Student(int sid,String sname,int age,boolean isMale){
        this.sid=sid;
        this.sname=sname;
        this.isMale=isMale;
        if(age>=1){
            this.age=age;
        }
    }
    
    /**
     * 学生做自我介绍
     */
    public void selfInfo(){
        System.out.println("大家好!我叫"+sname+",今年"+age+"岁");
    }
    
}

学生管理系统主程序的源代码

package day07;

import java.util.Scanner;

public class StudentTest {
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        Student[] students=new Student[5];
        int sno;
        String sname;//
        int age;
        int index=0;
        System.out.println("欢迎使用学生管理系统");
        boolean isMale;
        int location;
        int cmd;//表示用户的指令
        do{
            System.out.println("添加学生请输入:1");
            System.out.println("查询学生请输入:2");
            System.out.println("删除学生请输入:3");
            System.out.println("退出系统请输入:0");
            cmd=scan.nextInt();
            switch (cmd) {
            case 0:
                break;          
            case 1:
                isMale=false;
                System.out.println("请输入学号:");
                sno=scan.nextInt();
                System.out.println("请输入姓名:");
                sname=scan.next();
                System.out.println("请输入年龄:");
                age=scan.nextInt();
                System.out.println("是否为男(Y/N):");
                if(scan.next().toLowerCase().matches("^y|yes$")){
                    isMale=true;
                }
                students[index]=new Student(sno,sname,age,isMale);//把学生对象保存到数组里面
                index++;
                System.out.println("已成功添加该学生!");
                break;
            case 2:
                location=-1;
                System.out.println("请输入学号:");
                sno=scan.nextInt();
                for(int i=0;i<students.length;i++){
                    if(students[i]==null){
                        break;
                    }
                    if(students[i].sid==sno){
                        location=i;
                        System.out.println(
                                students[i].sid+","+students[i].sname+","+students[i].age+","+(students[i].isMale?"男":"女"));
                        break;
                    }
                }
                if(location==-1){
                    System.out.println("找不到该学生!");
                }
                break;
            case 3:
                location=-1;
                System.out.println("请输入学号:");
                sno=scan.nextInt();
                for(int i=0;i<students.length;i++){
                    if(students[i]==null){
                        break;
                    }
                    if(students[i].sid==sno){
                        location=i;
                        System.out.println(
                                students[i].sid+","+students[i].sname+","+students[i].age+","+(students[i].isMale?"男":"女"));
                        break;
                    }
                }
                if(location==-1){
                    System.out.println("找不到该学生!");
                }else{
                    //删除该学生
                    for(int i=location;i<students.length-1;i++){//location=2
                        students[i]=students[i+1];
                    }
                    students[students.length-1]=null;
                    index--;
                    System.out.println("已成功删除该学生");
                }
                
                break;              
            default:
                System.out.println("输入的命令错误!");
                break;
            }
            if(cmd==0){
                System.out.println("Bye!Bye!");
                break;//跳出循环
            }
        }while(true);
        scan.close();
    }
}

参考资料

Java内存泄漏与内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html
Java垃圾回收机制
https://www.cnblogs.com/dolphin0520/p/3783345.html

上一篇下一篇

猜你喜欢

热点阅读