常见的JVM虚拟机?
sun公司的HotSpot
BEA公司的JRockit
IBM公司的J9
Java代码编译执行过程?
源码编译:通过Java源码编译器把代码编译成JVM字节码(.class文件)。
类加载:通过类加载器完成JVM类的加载。
类执行:字节码被装入内存,进入 JVM 虚拟机,被解释器解释执行。
Java运行时一个类是什么时候被加载的?
HotSpot虚拟机采用的是按需加载,在用到这个类时去加载。
JVM一个类的加载过程?
加载:把类的class二进制字节流读进来,在内存中生成一个代表这个类的java.long.Class对象放入元空间。
验证:
准备:类静态变量赋默认初始值,int为0,long为0L,boolean为false,引用类型赋null。类静态常量赋实际值
解析:
初始化:在准备的时候会给变量赋初始值,而在初始化的时候会给变量赋真实值。静态变量在此时赋真实值,静态代码块也会执行。而普通变量是在创建对象时赋值,构造器和普通代码块也是在此时执行。
使用:
卸载:
JVM有哪些类加载器?
站在Java虚拟机的角度看有两种
启动类加载器(Bootstrap ClassLoader),使用C++语言实现,是虚拟机自身的一部分。
其他类加载器:使用Java语言开发,独立于虚拟机外部,并且都继承自抽象类ClassLoader
站在Java开发者的角度,有三层类加载器
BootstrapClassLoader
ExtClassLoader
AppClassLoader
JVM不同类加载器加载哪些文件?
启动类加载器(BootstrapClassLoader)
jre\lib\rt.jar、resouces.jar、charsets.jar
被-Xbootclasspath参数所指定的类库
扩展类加载器(ExtClassLoader)
jre\lib\ext
被java.long.ext系统变量所指定的路径中的所有类库
应用程序类加载器(AppClassLoader)
用户类路径(classpath)上所有的类库。即我们自己写的。
什么是双亲委派模型?
![](https://i-blog.csdnimg.cn/blog_migrate/e640a32b053a8cea6d7531560eef24cc.png)
如果一个类加载器收到了类加载的请求,它首先自己不会去加载这个类,而是把这个请求委派给上层的加载器去完成,每一层的类加载器都是如此,因此所有的类加载请求都会委派到最上层的类加载器中,然后从最上层开始加载,当该层无法加载这个类是,他就会告诉下一层类加载器,让其尝试加载。
双亲委派模型的优点?
确保安全,避免Java核心库被修改。
避免重复加载,保证类的唯一性。
如何打破JVM的双亲委派模型?
自定义一个类加载器(继承classLoader类即可),重写其中的loadClass方法,使其不再进行双亲委派。
ClassLoader类中的loadClass()、findClass()、defineClass()的区别?
loadClass():主要进行类加载的方法,默认的双亲委机制型就在这个方法中。
findClass():根据名称或位置加载.class字节码。
defineClass():把字节码转化为java.long.Class。
加载一个类用Class.forName和ClassLoader.loaderClass有什么区别?
Class.forName:得到的类是已经初始化的。
ClassLoader.loaderClass:得到的类还没有初始化。