目录
Java思维导图
1.谈谈你对java的理解
平台无关性,GC,语言特性,面向对象,类库
2.平台无关性如何实现
Compile Once,Run Anywhere如何实现?
编译时,运行时。
通过javap -c来查看编译过程。
为什么JVM不直接将源码解析成机器码去执行呢?
3.JVM如何加载class文件
我们从Class.forName()进入源码解析一下,再进入forName0()方法中。
到这里我们可以看native接口,也就是我们第一张图中看到的Native Interface
4.什么是反射
写一个反射的例子
5.ClassLoader
类从编译到执行的过程
谈谈ClassLoader
我们重点关注ClassLoader中的loadClass方法,发现loadClass中有个参数parent,再点击parent,会发现它也是一个ClassLoader
ClassLoader种类
ExtClassLoader
AppClassLoader
自定义ClassLoader的实现
package com.interview.reflect;
import java.io.*;
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 {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}
package com.interview.reflect;
public class ClassLoaderCheck {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader my =new MyClassLoader("C:/Users/peixinRo/Desktop/","MyClassLoader");
Class c = my.loadClass("Hello");
System.out.println(c.getClassLoader());
c.newInstance();
}
}
6.ClassLoader的双亲委派机制
源码解析
ClassLoader进入loadClass()方法,
parent加载App ClassLoader
findBootstrapClassOrNull加载Bootstrap ClassLoader
为什么要使用双亲委派机制去加载类?
避免多份同样字节码的加载。
7.loadClass和forName的区别
类的加载方式
类的装载过程
代码案例
package com.interview.classLoader;
public class Robot {
private String name;
public void sayHi(String stringhello) {
System.out.println(stringhello + name);
}
private String throwNmae(String tag) {
return "Hello" + tag;
}
static {
System.out.println("我是static");
}
}
package com.interview.classLoader;
public class LoadDifference {
public static void main(String[] args) throws ClassNotFoundException {
//不会加载静态区
// ClassLoader c = Robot.class.getClassLoader();
//控制台打印 我是static
Class<?> c = Class.forName("com.interview.classLoader.Robot");
}
}
小结
8.Java内存模型之线程独占部分
内存简介
地址空间的划分
JDK8-内存模型
程序计数器
Java虚拟机栈(Stack)
代码解释局部变量表和操作数栈
执行javap -verbose可以看到如下信息。
步骤解释:store出栈,load进栈。
iconst_0压入栈中,也就是int c=0。局部变量入参是1和2。
istore_2栈中的0pop出来,存入到局部变量的第二个中。
iload_0将第0个局部变量压入栈中。
......
报异常代码java.lang.StackOverflowError
小结
9.Java内存模型之线程共享部分
10.常见面试题
1.JVM三大性能调优参数
2.Java内存模型中堆和栈的区别
3.JDK6和JDK6+中String.intern()方法的区别
代码实现
JDK1.6
JDK1.7下
JDK1.6
JDK1.7下