Java基础之Runtime类和System类4月打卡day17

举报
java厂长 发表于 2022/04/13 09:14:50 2022/04/13
【摘要】 Java基础之Runtime类和System类4月打卡day17关于作者作者介绍🍓 博客主页:作者主页🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。Runtime类在每一个JVM的进程中,都会存在一个运行时的操作类的对象,...

Java基础之Runtime类和System类4月打卡day17

关于作者

  • 作者介绍


🍓 博客主页:作者主页

🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。

🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨‍💻。

Runtime类

在每一个JVM的进程中,都会存在一个运行时的操作类的对象,而这对象所属的类型就是Runtime类。打开这个类的文档,发现这个类之中并没有构造方法的定义,可是按照之前所学,每个类至少有一个构造方法,而这个类的构造方法实际上存在只是不被外部看见而已,因为构造方法私有化了,这是一个标准的单例设计模式,既然是单例设计模式则在这个类之中一定会存在一个static型方法,可以取得本类的Runtime实例化对象:public static Runtime getRuntime()。

取得了Runtime类之后最主要的功能就是可以通过它来观察当前的内存操作情况:

方法名称 类型 描述
public long freeMemory() 普通 取得当前空余内存空间大小
public long totalMemory() 普通 取得当前可以使用总空间大小
public long maxMemory() 普通 取得最大的可用内存空间的大小
public native void gc() 普通 执行垃圾收集处理

观察一下内存信息的取得

package com.day13.demo;
​
public class RuntimeDemo {
    public static void main(String[] args) {
        Runtime run = Runtime.getRuntime();
        System.out.println("1、MAX=" + byteToM(run.maxMemory()));
        System.out.println("1、TOTAL=" +  byteToM(run.totalMemory()));
        System.out.println("1、FREE=" +  byteToM(run.freeMemory()));
    }
    public static double byteToM(long num){
        return (double) num / 1024 / 1024;
    }
}
​

gc垃圾回收

package com.day13.demo;
​
public class RuntimeDemo {
    public static void main(String[] args) {
        Runtime run = Runtime.getRuntime();
        System.out.println("1、MAX=" + byteToM(run.maxMemory()));
        System.out.println("1、TOTAL=" +  byteToM(run.totalMemory()));
        System.out.println("1、FREE=" +  byteToM(run.freeMemory()));
        String str = "";
        for (int i = 0; i < 2222; i++) {
            str += i;
        }
        System.out.println("2、MAX=" + byteToM(run.maxMemory()));
        System.out.println("2、TOTAL=" +  byteToM(run.totalMemory()));
        System.out.println("2、FREE=" +  byteToM(run.freeMemory()));
        run.gc();//垃圾收集
        System.out.println("3、MAX=" + byteToM(run.maxMemory()));
        System.out.println("3、TOTAL=" +  byteToM(run.totalMemory()));
        System.out.println("3、FREE=" +  byteToM(run.freeMemory()));
    }
    public static double byteToM(long num){
        return (double) num / 1024 / 1024;
    }
}

面试题:什么叫gc?如何处理

  • gc(Garbage Conllector):垃圾收集器,用于释放无用的内存空间

  • gc有两种处理形式,一种是自动不定期调用,另外一种是使用Runtime的gc()方法手工处理调用。

System类

实际上在之前进行的数组拷贝就是运用System类中的public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

在这个类中提供有一个取得当前日期时间数的方法public static long currentTimeMillis();通过此方法可以取得某一个操作花费的时间。

观察currentTimeMillis()的使用

package com.day13.demo;
​
public class SystemDemo {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < 2222; i++) {
            str += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("花费时间:" + (end - start) + "ms");
    }
}

可是在System类之中还存在了一个很有意思的方法:public static void gc(),但是这个gc()方法并不是一个新的gc()方法而是间接调用了一个Runtime类之中的gc()方法,不表示一个重写的方法。

在之前一直强调过一个概念:一个类对象的创建一定要使用构造方法,那么一个对象不使用构造方法了,就一个被释放,被释放的时候一改也有一个方法进行支持才对。所以要想做这种收尾的操作,可以让一个类去覆写object中的finalize()方法。此方法由Object类定义:protected void finalize() throws Throwable。在对象回收之前有可能出现异常或者错误,但是即使出现了也不会影响程序的执行,即:不会因为异常而导致程序的中断执行。

finalize()方法使用

package com.day13.demo;
class Person{
    public Person(){
        System.out.println("问啊娃娃,出来了!");
    }
​
    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("我要下地狱了,下辈子不要当人了——");
        throw new Exception("继续要活几千年");
    }
    
}
public class FinalizeDemo {
    public static void main(String[] args) {
        Person person = new Person();
        person = null;
        System.out.println("已经转世不为人了");
        System.gc();
    }
}

面试题:请解释final、finally、finalize的区别?

  • final是一个关键字,用于定义不能够被继承的父类、不能够覆写的常量

  • finally是异常处理的统一出口

  • finalize是Object类中的方法,用于在对象回收前进行调用

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。