一 Runtime类的简单了解
Runtime 描述的是运行时的状态,也就是说在整个JVM之中,Runtime类是唯一一个与JVM运行状态有关的类,并且都会默认提供一个实例化对象
由于在每一个JVM进程里面只允许提供一个Runtime类对象,所以该类为单例设计模式,构造方法私有化,有一个static 方法(getRuntime)获得唯一的实例
案例:通过Runtime类获取Cpu、进程、内存等的相关信息
public class RuntimeDemo {
public static void main(String[] args) {
Runtime run = Runtime.getRuntime(); // 获取实例化对象
System.out.println(run.availableProcessors());// 可使用的进程数,本人电脑16核
System.out.println("单位是字,默认配置为本机系统的内存1/4:" + run.maxMemory()); // 获取最大可用内存空间
System.out.println("默认配置为本机系统的内存1/64:" + run.totalMemory()); // 获取可用内存空间
System.out.println("可用内存-已使用内存:" + run.freeMemory()); //获取空闲内存空间
run.gc();// 手工进行GC处理
}
}
提问:请问什么是GC?如何处理?
GC(Garbage Collector) 垃圾收集器,是可以由系统自动调用的垃圾释放功能,或者使用Runtime类中的gc方法手工调用
二 AutoCloseable接口的使用
AutoCloseable 是一个自动关闭资源的接口,资源使用完毕后不关闭资源会造成资源的浪费,下面是一个简单的案例
public class AutoCloseableDemo {
public static void main(String[] args)throws Exception {
try(IMessage nm = new NetMessage("kakazhe")){
nm.send();
}catch(Exception e) {
}
}
}
interface IMessage extends AutoCloseable{
public void send(); // 消息发送
}
class NetMessage implements IMessage {
private String msg;
public NetMessage(String msg) {
this.msg = msg;
}
public boolean open() { // 获取资源连接
System.out.println("【OPEN】获取消息发送连接资源");
return true;
}
@Override
public void send() {
if(this.open()) {
System.out.println("【***发送消息***】" + this.msg );
}
}
@Override
public void close() throws Exception {
System.out.println("【CLOSE】关闭消息发送通道");
}
}
值得注意的一点是,AutoCloseable的close函数有异常需要抛出,不然无法使用
三 使用AutoClose对对象进行回收释放
在jdk9之后,对对象的回收处理过程之中更多的情况下考虑的是多线程的使用,即:多对象回收前的处理都是单独通过一个线程完成的。这样能提高整体性能
import java.lang.ref.Cleaner;
class Member implements Runnable{
public Member() {
System.out.println("【构造】对象产生");
}
@Override
public void run() {// 执行清除的时候执行的是此操作
System.out.println("【回收】对象回收");
}
}
class MemberCleaning implements AutoCloseable{// 实现清除的处理
private static final Cleaner cleaner = Cleaner.create();// 创建一个清除处理
private Member member;
private Cleaner.Cleanable cleanable;
public MemberCleaning() {
this.member = new Member();//创建新对象
this.cleanable=this.cleaner.register(this, this.member); //注册使用的对象
}
@Override
public void close() throws Exception {
this.cleanable.clean();// 启动多线程
}
}
public class MemberCleaningDemo {
public static void main(String[] args) {
try(MemberCleaning mc = new MemberCleaning()){
// 中间可以执行的一些相关代码
}catch(Exception e) {
}
}
}