一、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的关闭
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.