Java基础之Runtime类和System类4月打卡day17
Java基础之Runtime类和System类4月打卡day17
关于作者
-
作者介绍
🍓 博客主页:
🍓 简介:JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛,斩获一系列荣誉🏆。
🍓 关注我:关注我学习资料、文档下载统统都有,每日定时更新文章,励志做一名JAVA资深程序猿👨💻。
在每一个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类中的方法,用于在对象回收前进行调用
- 点赞
- 收藏
- 关注作者
评论(0)