JVM探究
- 请你谈谈你对JVM的理解?java -> class -> jvm
java 8虚拟机和之前的变化更新 - OOM 内存溢出。栈溢出 StackOverFlowError > 怎么分析
- JVM的常用调优参数 ? 扩大内存
- 内存快照如何抓取,怎么分析Dump文件?知道吗?
- 谈谈JVM中,类加载器你的认识? rt-jar ext application
-
JVM的位置
-
JVM的体系结构
-
类加载器
-
双亲委派机制
- 首先,通过委派的方式,可以避免类的重复加载,当父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类
- 另外,通过双亲委派的方式,还保证了安全性。因为Bootstrap ClassLoader在加载的时候,只会加载JAVA_HOME中的jar包里面的类,如java.lang.Integer,那么这个类是不会被随意替换的,除非有人跑到你的机器上, 破坏你的JDK。
双亲委派代码
实现双亲委派的代码都集中在java.lang.ClassLoader的loadClass()方法之中:
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
- 沙箱安全机制
- Native
很重要
7. Pc寄存器
Program Counter Register
+1+1 线程不乱
8. 方法区 Method Area
此区域属于共享区间
- 栈 stack
栈溢出
栈:8大基本类型+对象引用+实例方法
子帧是为了调用子程序,子程序执行完需要找到原来的父帧的房重新执行
- 三种JVM
- 堆
- 新生区,老年区
- 永久区
- 堆内存调优
- GC 垃圾回收器
- JMM
- 总结
1.百度
2.思维导图 需要自己去画一下。
JVM 运行在 操作系统之上
JRE包含JVM