下面的点,用来面试的时候,进行说明
一:类的加载知识
1.平台无关性
2.jvm如何架在内存文件
3.classLoader
4.classloader分类
5.加载器的双亲委派机制
可以避免加载多份字节码
6.架在类的方式
隐式加载:new
显式加载:classLoad,forName
7.类的装载过程
8.源码
ClassLoader类中的loadClass方法
9.loadClass与forName的区别
forName:已经完成了初始化
loadClass:得到的class 是还没有完成链接的
为什么需要?
forName:例如使用mysql的驱动
loadClass:例如spring的延迟架在,主要为了初始化加载的速度
10.自定义classLoad
使用的主要有两个函数
findClass:将class文件加载为流文件
defineClass:将流转为class
package com.interview.javabasic.reflect; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class MyClassLoader extends ClassLoader { private String path; private String classLoaderName; public MyClassLoader(String path, String classLoaderName) { this.path = path; this.classLoaderName = classLoaderName; } //用于寻找类文件 @Override public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } //用于加载类文件 private byte[] loadClassData(String name) { name = path + name + ".class"; InputStream in = null; ByteArrayOutputStream out = null; try { in = new FileInputStream(new File(name)); out = new ByteArrayOutputStream(); int i = 0; while ((i = in.read()) != -1) { out.write(i); } } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); } } return out.toByteArray(); } }
测试:
package com.interview.javabasic.reflect; public class ClassLoaderChecker { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader"); Class c = m.loadClass("Wali"); System.out.println(c.getClassLoader()); System.out.println(c.getClassLoader().getParent()); System.out.println(c.getClassLoader().getParent().getParent()); System.out.println(c.getClassLoader().getParent().getParent().getParent()); c.newInstance(); } }
11.总结
类的加载
二:内存模型
1.从线程维度进行了解
2.程序计数器
3.虚拟机栈
4.递归容易引起StackOverFlowError
递归过深,栈帧数超过虚拟机栈深度
5.栈不需要回收
方法调用结束后,栈帧会自动释放
6.本地方法栈
与虚拟机很相似,标注是的native方法
7.元空间与永久代的区别
元空间使用的是本地内存
永久代使用的是jvm的内存
元空间比永久代的优势如下:
8.堆
三:一些面试点
1.调优参数
其中,Xss影响并发线程数的大小
2.堆栈的区别
3.intern方法在不同jdk中的区别
4.举例说明
1.6:
false:一个在堆中,一个在常量池中,所以false,以前是可以将堆的副本放到常量池中
false
1.8:
false
true