美文网首页
Java垃圾回收机制介绍

Java垃圾回收机制介绍

作者: 测试老杨 | 来源:发表于2019-04-04 08:40 被阅读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

    相关文章

      网友评论

          本文标题:Java垃圾回收机制介绍

          本文链接:https://www.haomeiwen.com/subject/uqbxiqtx.html