JAVA类加载器和tomcat类加载体系

一、JVM规范的类加载器

1. BootStrap Loader:加载/jre/lib或者System.getProperty("sun.boot.class.path")、或者-XBootclasspath参数指定的路径下的jar
2. Extended Loader:加载/jre/lib/ext或者System.getProperty("java.ext.dirs")、或者-Djava..ext.dirs参数指定的路径下的jar
3. AppClassLoader:加载System.getProperty("java.class.path")或者-cp参数指定的路径中的jar

二、tomcat的类加载体系

1. java.lang.ClassLoader:是Java提供的类加载器抽象类,所有的用户自定义的加载器都要继承实现这个类。

 Tomcat-7.0.68中加载器包是:org.apache.catalina.loader,类的实现个继承关系如下:

tomcat的类加载UML图
三、tomcat的关闭
tomcat的接收服务器关闭的端口是8005;

四、运行时关闭钩子
一个应用程序就是一个java命令运行起来的程序,比如tomcat。一个应用程序在虚拟机中运行起来了,虚拟机会为应用生成一个java.lang.Runtime类的实例,在应用中使用如下语句可以获取对应的运行时环境:
Runtime.getRuntime();
getRuntime()方法是一个静态的类方法,实现如下:

public static Runtime getRuntime() {
         return currentRuntime;
     }

currentRuntime 属性是一个静态属性,实现如下:
private static Runtime currentRuntime = new Runtime();

可见一个Runtime类的实例产生时currentRuntime 就已经产生。

Runtime类为应用添加关闭钩子的方法:

public void addShutdownHook(Thread hook) {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("shutdownHooks"));
        }
        ApplicationShutdownHooks.add(hook);
    }

hook是一个线程实例,实现了应用异常关闭时需要做的工作,一般是内存清理,对象销毁工作。

Runtime类为应用移除关闭钩子的方法 :

public boolean removeShutdownHook(Thread hook) {
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
           sm.checkPermission(new RuntimePermission("shutdownHooks"));
        }
        return ApplicationShutdownHooks.remove(hook);
    } 

当钩子线程在如下情况下会被执行:

1. Runtime.exit(),这时候会调用Shutdown.exit();
2. JNI来DestroyJVM,这时候会调用Shutdown.shutdown();

这个两个方法最终都会调用Shutdown.sequence(),该方法如下:

private static void sequence() {
        synchronized (lock) {
            if (state != HOOKS) return;
        }
        runHooks();
        boolean rfoe;
        synchronized (lock) {
            state = FINALIZERS;
            rfoe = runFinalizersOnExit;
        }
        if (rfoe) runAllFinalizers();
    }

最终钩子线程会被执行。

注明:Java源码版本是8.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值