运行时数据区
类生命周期
类加载器
验证问题
查看类对应的加载器
/**
* 查看类的加载器实例
*/
public class ClassLoaderView {
public static void main(String[] args) throws Exception {
// 加载核心类库的 BootStrap ClassLoader 打印出来是null
System.out.println("核心类库加载器:"
+ ClassLoaderView.class.getClassLoader().loadClass("java.lang.String").getClassLoader());
// 加载拓展库的 Extension ClassLoader
System.out.println("拓展类库加载器:" + ClassLoaderView.class.getClassLoader()
.loadClass("com.sun.nio.zipfs.ZipCoder").getClassLoader());
// 加载应用程序的
System.out.println("应用程序库加载器:" + ClassLoaderView.class.getClassLoader());
// 双亲委派模型 Parents Delegation Model
System.out.println("应用程序库加载器的父类:" + ClassLoaderView.class.getClassLoader().getParent());
System.out.println(
"应用程序库加载器的父类的父类:" + ClassLoaderView.class.getClassLoader().getParent().getParent());
}
}
JVM如何知道我们的类在何方
常用命令:
jps :查看本机JAVA进程
jcmd:查看java进程运行时配置
类不会重复加载
/**
* 指定class 进行加载e
*/
public class LoaderTest {
public static void main(String[] args) throws Exception {
URL classUrl = new URL("file:D:\\");//jvm 类放在位置
URLClassLoader parentLoader = new URLClassLoader(new URL[]{
classUrl});
while (true) {
// 创建一个新的类加载器
URLClassLoader loader = new URLClassLoader(new URL[]{
classUrl});
// 问题:静态块触发
Class clazz = loader.loadClass("HelloService");
System.out.println("HelloService所使用的类加载器:" + clazz.getClassLoader());
Object newInstance = clazz.newInstance();
Object value = clazz.getMethod("test").invoke(newInstance);
System.out.println("调用getValue获得的返回值为:" + value);
Thread.sleep(3000L); // 1秒执行一次
System.out.println();
// help gc -verbose:class
newInstance = null;
loader = null;
}
// System.gc();
}
}
类的卸载
-verbose:class
双亲委派模型
/**
* 热加载,指定class 进行加载e
*/
public class LoaderTest1 {
public static void main(String[] args) throws Exception {
URL classUrl = new URL("file:D:\\");
// 测试双亲委派机制
// 如果使用此加载器作为父加载器,则下面的热更新会失效,因为双亲委派机制,HelloService实际上是被这个类加载器加载的;
// URLClassLoader parentLoader = new URLClassLoader(new URL[]{classUrl});
while (true) {
// 创建一个新的类加载器,它的父加载器为上面的parentLoader
URLClassLoader loader = new URLClassLoader(new URL[]{
classUrl}, LoaderTest1.class.getClassLoader());
Class clazz = loader.loadClass("HelloService");
System.out.println("HelloService所使用的类加载器:" + clazz.getClassLoader());
Object newInstance = clazz.newInstance();
Object value = clazz.getMethod("test").invoke(newInstance);
System.out.println("调用getValue获得的返回值为:" + value);
// help gc
newInstance = null;
value = null;
System.gc();
loader.close();
Thread.sleep(3000L); // 1秒执行一次
System.out.println();
}
}
}
转载:https://blog.csdn.net/Larry_zhu_123/article/details/115841827
查看评论