导语
了解就好。
主要内容
- Runtime类的主要作用
- Runtime类的定义形式
- System类
- 如何计算某个代码的执行时间
- 进行垃圾收集操作
具体内容
Runtime类
在每一个JVM进程 里面都坐存在有一个Runtime类对象,这个类的主要功能是取得一些与运行时有关的环境属性或者创建新的进程等操作。
在Runtime类定义的时候它的构造方法已经被私有化了,这就属于单例设计模式的应用,因为要保证在整个进程 里只有唯一的一个Runtime类的对象。所以在Runtime类里面提供有一个static型的方法,这个方法可以取得Runtime类的实例化对象:public static Runtime getRuntime()。
Runtime类是直接与本地运行有关的所有相关属性的集合,所以在Runtime类里面定义有如下的几个方法:
- 返回所有可用内存空间:public long totalMemory()。
- 返回所有最大内存空间:public long maxMemory()。
- 返回空余内存空间:public long freeMemory()。
范例:观察内存大小
public class TestDemo {
public static void main(String args[]) {
Runtime run = Runtime.getRuntime(); // 取得Runtime类的实例化对象
System.out.println("1、MAX = " + run.maxMemory());
System.out.println("1、TOTAL = " + run.totalMemory());
System.out.println("1、FREE = " + run.freeMemory());
}
}
输出结果
1、MAX = 1424490496
1、TOTAL = 96468992
1、FREE = 94950656
修改代码
public class TestDemo {
public static void main(String args[]) {
Runtime run = Runtime.getRuntime(); // 取得Runtime类的实例化对象
System.out.println("1、MAX = " + run.maxMemory());
System.out.println("1、TOTAL = " + run.totalMemory());
System.out.println("1、FREE = " + run.freeMemory());
String str = "";
for(int i = 0; i < 1000; i++) {
str += x; // 产生大量垃圾
}
System.out.println("2、MAX = " + run.maxMemory());
System.out.println("2、TOTAL = " + run.totalMemory());
System.out.println("2、FREE = " + run.freeMemory());
}
}
输出结果
1、MAX = 1424490496
1、TOTAL = 96468992
1、FREE = 94950656
2、MAX = 1424490496
2、TOTAL = 96468992
2、FREE = 93229744
如果一旦产生了过多的垃圾之后,那么就会改变可用的内存空间的大小。
可是在Runtime类里面有一个方法:public void gc(),可以释放掉垃圾空间。
修改代码
public class TestDemo {
public static void main(String args[]) {
Runtime run = Runtime.getRuntime(); // 取得Runtime类的实例化对象
System.out.println("1、MAX = " + run.maxMemory());
System.out.println("1、TOTAL = " + run.totalMemory());
System.out.println("1、FREE = " + run.freeMemory());
String str = "";
for(int i = 0; i < 1000; i++) {
str += x; // 产生大量垃圾
}
System.out.println("2、MAX = " + run.maxMemory());
System.out.println("2、TOTAL = " + run.totalMemory());
System.out.println("2、FREE = " + run.freeMemory());
run.gc(); // 释放垃圾空间
System.out.println("3、MAX = " + run.maxMemory());
System.out.println("3、TOTAL = " + run.totalMemory());
System.out.println("3、FREE = " + run.freeMemory());
}
}
输出结果
1、MAX = 1424490496
1、TOTAL = 96468992
1、FREE = 94950656
2、MAX = 1424490496
2、TOTAL = 96468992
2、FREE = 93229744
3、MAX = 1424490496
3、TOTAL = 96468992
3、FREE = 95444272
面试题:请解释什么叫GC?如何处理?
- GC(Garbage Collector)垃圾收集器,指的是释放无用的内存空间。
- GC会由系统不定期进行自动的回收,或者调用Runtime类中的gc()方法手工回收。
实际上Runtime类还有一个更加有意思的功能,就是它可以调用本机的可执行程序,并且创建进程。
执行程序:public Process exec(String command) throws IOException。
public class TestDemo {
public static void main(String args[]) throws Exception {
Runtime run = Runtime.getRuntime();
Process pro = run.exec("mspaint.exe"); // 调用本机可执行程序画图工具
Thread.sleep(2000);
pro.destroy(); // 销毁进程
}
}
System类
之前 一直使用的“System.out.println()”就属于System类的操作功能,只不过这个功能由于牵扯到IO部分,那些留到以后讲解。
在System类里面定义的几个重要的方法:
- 取得当前的系统时间:public static long currentTimeMillis()。
- System类中调用Runtime的gc()方法:public static void gc()。
对象产生一定会调用构造方法,可以进行一些处理操作,但是某一个对象如果要被回收了,那么连一个收尾的机会都没有。如果需要给对象一个收尾的机会,那么就可以考虑覆写Object类中的finalize()方法完成。
finalize()方法:protected void finalize() throws Throwable。
在对象回收时就算抛出了任何的异常,也不会影响到整个程序的正常执行。
public class Member {
public Member() {
System.out.println("对象被创建");
}
@Override
protected void finalize() throws Throwable {
System.out.println("对象被销毁");
throw new Exception("销毁时抛出异常"); // 看不到这个
}
}
public class TestDemo {
public static void main(String args[]) {
Member mem = new Member(); // 会出现一些创建操作
mem = null; // 会产生垃圾
System.gc(); // 手工处理垃圾收集
}
}
输出结果
对象被创建
对象被销毁
构造方法是留给对象初始化时使用的,而finalize()方法是留给对象回收前使用的。
面试题:请解释final、finally、finalize的区别?
- final:关键字,定义不能被继承的类、不能被覆写的方法、常量。
- finally:关键字,异常的统一出口。
- finalize:方法,Object类提供的方法(protected void finalize() throws Throwable),指的是对象回收前的收尾方法,即使出现了异常也不会导致程序中断执行。
总结
- Runtime类使用了单例设计模式,必须通过getRuntime()方法才可以取得Runtime类对象。
- Runtime类提供了gc()方法,可以手工释放内存。
- System类可以使用currentTimeMillies()方法取得当前的系统时间。
- System类中的gc()方法就直接调用了Runtime.getRuntime.gc()方法。
public class TestDemo {
public static void main(String args[]) {
}
}
更多内容戳这里(整理好的各种文集)