下面的点,用来面试的时候,进行说明

一:类的加载知识
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