1.描述一下JVM加载class文件的原理机制?
装载:查找并加载类的二进制数据
链接:
- 验证:确保加载类的正确性,安全性(有些高手会编写class文件让JVM加载)
- 准备:为类的静态属性分配内存,并将其赋予默认值(static int a = 30,此处a 赋予默认值 0 )
- 解析:把类中的符号引用转换为直接引用
初始化:为类的静态属性赋予初始值(上面的a = 30)
2.什么时候类初始化?
- 一个类实例化的时候,也就是new一个对象的时候
- 调用一个类或接口的静态变量的时候,或者给静态变量赋值的时候
- 调用一个类的静态方法时
- 反射(Class.forName("…"))
- 初始化一个类的子类的时候(首先初始化父类)
- JVM启动是的启动类,就是文件名与类名相同的那个类
3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
4.String.intern()方法
如果字符串常量池中已经包含了一个等于此String对象的字符串,则返回代表池(运行时常量池)中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中并且返回此String对象的引用
String s1 = new String("hello");
System.out.printlen(s1.intern() == s1);//true
5.java中存在内存泄漏吗?举例说明