一、知识总结
花了大概十天的时间看完了周志明老师的深入理解Java虚拟机,现在对JVM已经有了一定的了解。
但由于书中知识点实在太多,不清楚重点在哪,所以我找到了如下文章方便今后的复习
上面这篇总结其实还是比较浅的,所以面试前应该把书的几个重点章节多复习几遍
二、补充
看书的过程中遇到了一些问题,当时为解决这些问题我收藏了一些博客
1、双亲委派机制及作用
2、Server和Client
3、JNI
4、解析与分派
5、泛型、类型擦除
6、编译优化
7、如何设置JVM堆大小
主要看应用中的对象,如果大对象、存活时间长的对象较多那就要增加老年代的大小。
如果都new的对象较多,那就增加年轻代
如果工具类(全是静态方法)比较多,那就涉及到方法区(1.7在堆,1.8在元空间(本地堆))
三、自己的实践练习
自定义类加载器
Student类:
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
List<Integer> list=new ArrayList<>();
Integer[]a=list.toArray(new Integer[3]);
}
public Student(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
将其class文件放到桌面上
编写类加载器并使用
public class TestClassLoader {
public static void main(String[] args) throws Exception {
MyClassLoader loader=new MyClassLoader("C:\\Users\\PC\\Desktop");//找桌面上的class
Class<?> clazz=Class.forName("com.test.Student", true, loader);
//虽然此时Student.class是放在桌面上,而不是放在com.test包里,但是此时Student类的全名依然为com.test.Student
//第二个参数代表是否初始化类,第三个参数指定类加载器
Constructor<?> con=clazz.getDeclaredConstructor(Integer.class,String.class);
Object obj =con.newInstance(1,"小红");
System.out.println(obj.toString());
}
}
class MyClassLoader extends ClassLoader{
private String rootDir;
public MyClassLoader(String rootDir) {
this.rootDir = rootDir;
}
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classData = getClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
} else {
return defineClass(name, classData, 0, classData.length);
}
}
private byte[] getClassData(String className) {
String path = classNameToPath(className);
try {
InputStream ins = new FileInputStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead;
while ((bytesNumRead = ins.read(buffer)) != -1) {
baos.write(buffer, 0, bytesNumRead);
}
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private String classNameToPath(String className) {
return rootDir + File.separatorChar
+ className.replace('.', File.separatorChar) + ".class";
}
}
运行结果